在ZonedDateTime或Instant中将小时分和秒设置为00

Wit*_*ult 8 java date java-8 zoneddatetime

我有一个Utc格式的日期字符串 -

    String dateStr = "2017-03-03T13:14:28.666Z";
Run Code Online (Sandbox Code Playgroud)

我想在ZonedDateTime的 Java日期表示中将其转换为以下格式.

ZonedDateTime打印时,它应该显示

    String dateStr = "2017-03-03T00:00:00.000Z";
Run Code Online (Sandbox Code Playgroud)

我试过以下代码 -

    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);
Run Code Online (Sandbox Code Playgroud)

输出:

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]
Run Code Online (Sandbox Code Playgroud)

我希望在ZonedDateTime中对开始时间进行规范化.我想用java库来实现它,而不是任何第三方库.

Bas*_*que 21

TL;博士

你工作太辛苦了.

Instant.parse( "2017-03-03T13:14:28.666Z" )
       .truncatedTo( ChronoUnit.DAYS )
       .toString()
Run Code Online (Sandbox Code Playgroud)

2017-03-03T00:00.00Z

细节

"在ZonedDateTime中规范化"是什么意思?请编辑您的问题以澄清.

打印ZonedDateTime时,应显示......"2017-03-03T00:00:00.000Z"

你问的是矛盾.A ZonedDateTime具有指定的时区,用于查看特定区域的挂钟时间.因此要求a ZonedDateTime生成一个UTC字符串"2017-03-03T00:00:00.000Z"是没有意义的.的Z是短期的Zulu,并指UTC.

您的输入字符串采用标准ISO 8601格式.默认情况下,java.time类使用这些标准格式.因此无需指定格式化模式,不需要DateTimeFormatter该类.

解析为InstantUTC中时间轴上的一个点,分辨率为纳秒.

Instant instant = Instant.parse( "2017-03-03T13:14:28.666Z" );
Run Code Online (Sandbox Code Playgroud)

如果你想要UTC的午夜,请截断.

Instant instantMidnightUtc = instant.truncatedTo( ChronoUnit.DAYS );
Run Code Online (Sandbox Code Playgroud)

instantMidnightUtc.toString():2017-03-03T00:00.00Z

不需要ZonedDateTime上课.

如果您想使用仅限日期而没有任何时间且没有时区,请使用LocalDate该类.

顺便说一下,不要假设一天中的第一时刻总是如此00:00:00.对于UTC来说也是如此.但是,各个时区可能会出现异常情况,例如夏令时(DST),其中一天可能会在另一个时间开始,例如01:00:00.


关于java.time

java.time框架是建立在Java 8和更高版本.这些类取代麻烦的老传统日期时间类,如java.util.Date,Calendar,和SimpleDateFormat.

现在处于维护模式Joda-Time项目建议迁移到java.time类.

要了解更多信息,请参阅Oracle教程.并搜索Stack Overflow以获取许多示例和解释.规范是JSR 310.

从哪里获取java.time类?

ThreeTen-额外项目与其他类扩展java.time.该项目是未来可能添加到java.time的试验场.您可以在此比如找到一些有用的类Interval,YearWeek,YearQuarter,和更多.