可能な解決策: Convert Java Date to another Time as Date format
私はそれを試してみましたが、答えが得られません。
文字列 "2013-07-17T03:58:00.000Z"があり、それを取得するのと同じ形式の日付に変換したい新しいDate()。Date d = new Date();
時間はIST.Zone-Asia/Kolkataである必要があります
したがって、上記の文字列の日付は
2013年7月17日水曜日12:05:16 IST 2013 //インド標準時GMT + 0530による時間
String s="2013-07-17T03:58:00.000Z";
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
TimeZone tx=TimeZone.getTimeZone("Asia/Kolkata");
formatter.setTimeZone(tx);
d= (Date)formatter.parse(s);
タイムゾーンにカレンダーを使用します。
TimeZone tz = TimeZone.getTimeZone("Asia/Calcutta");
Calendar cal = Calendar.getInstance(tz);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
sdf.setCalendar(cal);
cal.setTime(sdf.parse("2013-07-17T03:58:00.000Z"));
Date date = cal.getTime();
ただし、この場合は Joda Time をお勧めします。この状況に適した機能があるためです。 JodaTimeの場合、次のようなことができます。
DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
DateTime dt = dtf.parseDateTime("2013-07-17T03:58:00.000Z");
Date date = dt.toDate();
日付にはタイムゾーンがありません。日付の文字列表現がインドのタイムゾーンにあることを知りたい場合は、タイムゾーンをインド標準に設定した別のSimpleDateFormatを使用し、この新しいSimpleDateFormatで日付をフォーマットします。
編集:サンプルコード:
String s = "2013-07-17T03:58:00.000Z";
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX");
Date d = formatter.parse(s);
System.out.println("Formatted Date in current time zone = " + formatter.format(d));
TimeZone tx=TimeZone.getTimeZone("Asia/Calcutta");
formatter.setTimeZone(tx);
System.out.println("Formatted date in IST = " + formatter.format(d));
出力(現在のタイムゾーンはパリ-GMT + 2):
Formatted Date in current time zone = 2013-07-17T05:58:00.000+02
Formatted date in IST = 2013-07-17T09:28:00.000+05
現代的な答えを提供したいと思います。そして、あなたに提案を与えてください:Date.toString()
があなたに与えたものを再現するよりも、関連するロケールのユーザーのために組み込みのフォーマットを使用する方が良いです:
String isoString = "2013-07-17T03:58:00.000Z";
String humanReadable = Instant.parse(isoString)
.atZone(userTimeZone)
.format(localizedFormatter);
System.out.println(humanReadable);
私のコンピューターではこれが印刷されます
17 July 2013 at 09.28.00 IST
私のスニペットはいくつかの定数を使用しています
private static final ZoneId userTimeZone = ZoneId.of("Asia/Kolkata");
private static final DateTimeFormatter localizedFormatter = DateTimeFormatter
.ofLocalizedDateTime(FormatStyle.LONG)
.withLocale(Locale.getDefault(Locale.Category.FORMAT));
withLocale
呼び出しは、既定の形式のロケールを渡すだけでは冗長です。ユーザーが別のロケールを必要とする場合に、明示的なロケールを提供する場所があるようにそれを配置します。また、コードを読んでいる人がそのことを考えなかった場合に備えて、結果がロケールに依存することを明示するという利点もあります。
私はJava.time
、最新のJava日付と時刻のAPIを使用しています。古いDate
、TimeZone
悪名高い厄介なDateFormat
とSimpleDateFormat
。あなたの文字列はISO 8601標準に準拠しています。これは、現代のクラスがデフォルトとして、つまり明示的なフォーマッターなしで解析する形式です。
もちろん、必要に応じて、昔ながらのDate
が提供していたのと同じ形式を使用できます。上記のフォーマッタを次のフォーマッタに置き換えてください:
private static final DateTimeFormatter asUtilDateFormatter
= DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ROOT);
今、私たちは得る:
Wed Jul 17 09:28:00 IST 2013
Oracleチュートリアル でJava.time
を使用する方法についての詳細をお読みください。