String dateStr = "2017-03-03T13:14:28.666Z";
我想在ZonedDateTime的Java日期表示中将其转换为以下格式.@H_404_5@
当ZonedDateTime打印时,它应该显示@H_404_5@
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)); 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),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库来实现它,而不是任何第三方库.@H_404_5@
解决方法
你工作太辛苦了.@H_404_5@
Instant.parse( "2017-03-03T13:14:28.666Z" ) .truncatedTo( ChronoUnit.DAYS ) .toString()
2017-03-03T00:00.00Z@H_404_5@
细节@H_404_5@
“在ZonedDateTime中规范化”是什么意思?请编辑您的问题以澄清.@H_404_5@
When ZonedDateTime is printed it should show … “2017-03-03T00:00:00.000Z”@H_404_5@
你问的是矛盾. ZonedDateTime具有指定的时区,用于查看特定区域的挂钟时间.因此要求ZonedDateTime以UTC格式生成字符串,例如“2017-03-03T00:00:00.000Z”是没有意义的. Z是Zulu的缩写,意思是UTC.@H_404_5@
您的输入字符串采用标准ISO 8601格式.默认情况下,java.time类使用这些标准格式.因此无需指定格式化模式,也不需要DateTimeFormatter类.@H_404_5@
解析为即时,UTC时间轴上的一个点,分辨率为纳秒.@H_404_5@
Instant instant = Instant.parse( "2017-03-03T13:14:28.666Z" );
如果你想要UTC的午夜,请截断.@H_404_5@
Instant instantMidnightUtc = instant.truncatedTo( ChronoUnit.DAYS );
instantMidnightUtc.toString(): 2017-03-03T00:00.00Z@H_404_5@
不需要ZonedDateTime类.@H_404_5@
如果您希望仅使用日期而不使用任何时间且没有时区,请使用LocalDate类.@H_404_5@
顺便说一下,不要假设当天的第一时刻总是00:00:00.对于UTC来说也是如此.但是,各个时区可能会出现异常情况,例如夏令时(DST),其中一天可能会在另一个时间点开始,例如01:00:00.@H_404_5@
关于java.time@H_404_5@
java.time框架内置于Java 8及更高版本中.这些类取代了麻烦的旧legacy日期时间类,如java.util.Date
,Calendar
和& SimpleDateFormat
.@H_404_5@
Joda-Time项目,现在是maintenance mode,建议迁移到java.time类.@H_404_5@
要了解更多信息,请参阅Oracle Tutorial.并搜索Stack Overflow以获取许多示例和说明.规格是JSR 310.@H_404_5@
>内置.
>部分标准Java API,带有捆绑实现.
> Java 9增加了一些小功能和修复.@H_404_5@
>大部分java.time功能都被反向移植到Java 6& 7月在ThreeTen-Backport.@H_404_5@
> ThreeTenABP项目特别适用于Android的ThreeTen-Backport(如上所述).
>见How to use ThreeTenABP….@H_404_5@
ThreeTen-Extra项目使用其他类扩展了java.time.该项目是未来可能添加到java.time的试验场.您可以在这里找到一些有用的类,例如Interval
,YearWeek
,YearQuarter
和more.@H_404_5@