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

Set hours minutes and seconds to 00 in ZonedDateTime or Instant

我有一个 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 库而不是任何第三方库来实现它。

   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);

您只需要获取所有必填字段。例如,日期格式。

希望对您有所帮助

你可以简单地做:

DateUtils.truncate(yourDate, Calendar.DAY_OF_MONTH);

希望对您有所帮助

tl;博士

你太辛苦了

Instant.parse( "2017-03-03T13:14:28.666Z" )
       .truncatedTo( ChronoUnit.DAYS )
       .toString()

2017-03-03T00:00.00Z

详情

"normalized in ZonedDateTime"是什么意思?请编辑您的问题以澄清。

When ZonedDateTime is printed it should show … "2017-03-03T00:00:00.000Z"

你问的是矛盾的。 ZonedDateTime 有一个指定的时区,当您想要通过特定区域的挂钟时间查看时刻时。因此,要求 ZonedDateTime 以 UTC 格式生成字符串,例如 "2017-03-03T00:00:00.000Z" 是没有意义的。 ZZulu 的缩写,表示 UTC。

您输入的字符串采用标准 ISO 8601 格式。 java.time classes 默认使用这些标准格式。所以不需要指定格式化模式,不需要 DateTimeFormatter class.

解析为 Instant,UTC 时间轴上的一个点,分辨率为纳秒。

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 class.

如果你想使用没有任何时间和时区的仅日期,请使用 LocalDate class.

顺便说一下,不要假设一天的第一时刻总是 00:00:00。 UTC 也是如此。但是不同的时区可能有异常,例如夏令时 (DST),一天可能从另一个时间开始,例如 01:00:00.


关于java.time

java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

Joda-Time project, now in maintenance mode, advises migration to the java.time classes.

要了解更多信息,请参阅 Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310

从哪里获得java.time classes?

  • Java SE 8 and SE 9 及更高版本
    • 内置。
    • 标准 Java API 的一部分,带有捆绑实施。
    • Java 9 添加了一些小功能和修复。
  • Java SE 6 and SE 7
  • Android
    • ThreeTenABP 项目专门为 Android 改编 ThreeTen-Backport(上面提到的)。
    • 参见

ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as Interval, YearWeek, YearQuarter, and more.