Utc形式の日付文字列があります-
String dateStr = "2017-03-03T13:14:28.666Z";
そして、私はそれをJava ZonedDateTimeの日付表現で以下の形式に変換したいと思います。
ZonedDateTimeが出力されると表示されます
String dateStr = "2017-03-03T00:00:00.000Z";
私は次のコードを試しました-
String timeZone = "America/Los_Angeles";
DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSX");
DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
ZoneId zoneId1 = ZoneId.of(timeZone);
String dateStr = "2017-03-03T13:14:28.666Z";
Instant inst = Instant.parse(dateStr, dtf2);
ZonedDateTime dateTimeInTz = ZonedDateTime.ofInstant(inst, zoneId1);
ZonedDateTime startTime = dateTimeInTz.with(LocalTime.of(0, 0, 0, 0));
ZonedDateTime endTime = dateTimeInTz.with(LocalTime.MAX);
System.out.println("Start:"+startTime+", End:"+endTime);
System.out.println("Start:"+startTime.toString()+", End:"+endTime.toString());
ZonedDateTime nT = ZonedDateTime.of ( LocalDate.parse(dateStr, dtf1) , LocalTime.of (0,0,0,0) , ZoneId.of ( timeZone ) );
System.out.println("Start:"+nT);
出力:
Start:2017-03-03T00:00-08:00[America/Los_Angeles], End:2017-03-03T23:59:59.999999999-08:00[America/Los_Angeles]
Start:2017-03-03T00:00-08:00[America/Los_Angeles], End:2017-03-03T23:59:59.999999999-08:00[America/Los_Angeles]
Start:2017-03-03T00:00-08:00[America/Los_Angeles]
開始時刻をZonedDateTimeで正規化します。 Javaライブラリを使用してそれを達成したいのは、サードパーティのライブラリだけではありません。
あなたは働きすぎです。
Instant.parse( "2017-03-03T13:14:28.666Z" )
.truncatedTo( ChronoUnit.DAYS )
.toString()
2017-03-03T00:00.00Z
「ZonedDateTimeで正規化」とはどういう意味ですか?明確にするために質問を編集してください。
ZonedDateTimeが出力されると、… "2017-03-03T00:00:00.000Z"と表示されます。
あなたが求めているのは矛盾です。 ZonedDateTime
には、特定の地域の実時間で瞬間を表示したい場合のタイムゾーンが割り当てられています。したがって、ZonedDateTime
に"2017-03-03T00:00:00.000Z"
などのUTCで文字列を生成するように要求しても意味がありません。 Z
はZulu
の略で、UTCを意味します。
入力文字列は標準のISO 8601形式です。 Java.timeクラスは、デフォルトでこれらの標準形式を使用します。したがって、フォーマットパターンを指定する必要はなく、DateTimeFormatter
クラスも必要ありません。
ナノ秒の分解能を持つUTCのタイムライン上のポイントInstant
として解析します。
Instant instant = Instant.parse( "2017-03-03T13:14:28.666Z" );
UTCで真夜中にしたい場合は、切り捨ててください。
Instant instantMidnightUtc = instant.truncatedTo( ChronoUnit.DAYS );
instantMidnightUtc.toString():2017-03-03T00:00.00Z
ZonedDateTime
クラスは必要ありません。
時刻とタイムゾーンなしで日付のみを操作する場合は、LocalDate
クラスを使用します。
ちなみに、その日の最初の瞬間が常に00:00:00
であると想定しないでください。 UTCについても同様です。ただし、さまざまなタイムゾーンに夏時間(DST)などの異常があり、01:00:00
などの別の時刻に1日が始まる場合があります。
Java.time フレームワークはJava 8以降に組み込まれています。これらのクラスは、面倒な古い レガシー のような日時クラスに取って代わります- Java.util.Date
、 Calendar
、& SimpleDateFormat
。
Joda-Time プロジェクトは maintenance mode になり、 Java.time クラスへの移行を推奨しています。
詳細については、 Oracleチュートリアル を参照してください。スタックオーバーフローで多くの例と説明を検索してください。仕様は JSR 31 です。
Java.timeクラスはどこで入手できますか?
ThreeTen-Extra プロジェクトは、追加のクラスでJava.timeを拡張します。このプロジェクトは、Java.timeに将来追加される可能性があることを証明する場です。 Interval
、 YearWeek
、 YearQuarter
のようないくつかの便利なクラスがここにあります。 、および more 。
String timeZone = "America/Los_Angeles";
DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSX");
DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
ZoneId zoneId1 = ZoneId.of(timeZone);
String dateStr = "2017-03-03T13:14:28.666Z";
Instant inst = Instant.parse(dateStr, dtf2);
ZonedDateTime dateTimeInTz = ZonedDateTime.ofInstant(inst, zoneId1);
ZonedDateTime startTime = dateTimeInTz.with(LocalTime.of(0, 0, 0, 0));
ZonedDateTime endTime = dateTimeInTz.with(LocalTime.MAX);
String strStart = (startTime.toString().split("T"))[0] + "T00:00:00.000Z";
String strEnd = (endTime.toString().split("T"))[0] + "T00:00:00.000Z";
System.out.println("Start:"+strStart +", End:"+strEnd );
新しいメソッドを編集:
TimeZone timeZone = TimeZone.getTimeZone("Europe/Copenhagen");
Calendar cal = Calendar.getInstance(timeZone);
Calendar defaut = new GregorianCalendar( cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH),0,0,0);
必要なフィールドをすべて取得する必要があります。たとえば、dateFormatを使用します。
それがあなたを助けることを願っています