web-dev-qa-db-ja.com

ZonedDateTimeまたはInstantで時間の分と秒を00に設定します

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ライブラリを使用してそれを達成したいのは、サードパーティのライブラリだけではありません。

11
WitVault

tl; dr

あなたは働きすぎです。

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で文字列を生成するように要求しても意味がありません。 ZZuluの略で、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.time フレームワークはJava 8以降に組み込まれています。これらのクラスは、面倒な古い レガシー のような日時クラスに取って代わります- Java.util.DateCalendar 、& SimpleDateFormat

Joda-Time プロジェクトは maintenance mode になり、 Java.time クラスへの移行を推奨しています。

詳細については、 Oracleチュートリアル を参照してください。スタックオーバーフローで多くの例と説明を検索してください。仕様は JSR 31 です。

Java.timeクラスはどこで入手できますか?

ThreeTen-Extra プロジェクトは、追加のクラスでJava.timeを拡張します。このプロジェクトは、Java.timeに将来追加される可能性があることを証明する場です。 IntervalYearWeekYearQuarter のようないくつかの便利なクラスがここにあります。 、および more

21
Basil Bourque
   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を使用します。

それがあなたを助けることを願っています

0
hartar