web-dev-qa-db-ja.com

T-Z形式の文字列を日付に変換する

可能な解決策: 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);
16
user2511713

タイムゾーンにカレンダーを使用します。

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();
22
Mark M

日付にはタイムゾーンがありません。日付の文字列表現がインドのタイムゾーンにあることを知りたい場合は、タイムゾーンをインド標準に設定した別の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
4
JB Nizet

Java.time

現代的な答えを提供したいと思います。そして、あなたに提案を与えてください: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を使用しています。古いDateTimeZone悪名高い厄介なDateFormatSimpleDateFormat。あなたの文字列は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を使用する方法についての詳細をお読みください。

0
Ole V.V.