tl;博士
- 将格式设置模式从 更改为 。
kk
HH
- 你增加一分钟是无关紧要的。
2018-06-18 24:01
...成为:
2018-06-18 00:01
提示: 调试时,请在生成 .String
ZonedDateTime.now(
ZoneId.of( "Africa/Tunis" )
)
.truncatedTo( ChronoUnit.DAYS )
.with(
TemporalAdjusters.previousOrSame( DayOfWeek.MONDAY )
)
.toString()
2018-06-18T00:00+01:00[非洲/突尼斯]
k
= 1-24 小时(实际上,24-23 小时)
Jorn Vernee删除的答案是正确的:您正在使用记录为使用从1到24的24小时制来表示一天中的时间。k
文档中不太清楚的是,第一个小时被计为 24,而不是 0。因此,最好说这一天从24-23开始,也就是说。该值表示一天中的第一个小时,而不是最后一个小时。24, 1, 2, 3, … , 22, 23
24
下面是一个仅使用时间的简单示例来演示此行为。
DateTimeFormatter f = DateTimeFormatter.ofPattern( "kk:mm" );
LocalTime lt = LocalTime.MIN;
String output = lt.format( f );
System.out.println( lt.toString() ); // Standard ISO 8601 format, 00-24.
System.out.println( output ); // `kk` format is 24, 1 , 2, … , 22 , 23.
00:00
24:00
请注意,java.time 的这种行为,其中一天的整个第一个小时都被标记为不寻常、非标准且不常用。参见维基百科。显然,这种风格偶尔会用于一些特殊场合,其中工作时间超过午夜,例如广播。kk
24
至于你所期望的...
在 24 小时制表示中,它应该是 00:01。
如果需要 0-23,请使用“H”,如文档所述。
首先,查看默认的 ISO 8601 格式输出。
ZonedDateTime currentDateTime = ZonedDateTime.now();
ZonedDateTime startOfThisWeek = currentDateTime.with( DayOfWeek.MONDAY ).truncatedTo( ChronoUnit.DAYS ).plusMinutes( 1 );
ZonedDateTime endOfThisWeek = startOfThisWeek.plusDays( 6 );
System.out.println( startOfThisWeek );
System.out.println( endOfThisWeek );
2018-06-18T00:01-07:00[美国/Los_Angeles]
2018-06-24T00:01-07:00[美国/Los_Angeles]
现在,您的自定义格式。将格式设置模式从 更改为 。kk
HH
DateTimeFormatter df = DateTimeFormatter.ofPattern( "yyyy-MM-dd HH:mm" );
String startweek = startOfThisWeek.format( df );
String endweek = endOfThisWeek.format( df );
System.out.println( startweek );
System.out.println( endweek );
2018-06-18 00:01
2018-06-24 00:01
周
其他一些注意事项...
如果您尝试表示一周,则无需添加一分钟。表示时间跨度的一般最佳实践是半开放方法,其中开头是包容性的,而结尾是排他性的。因此,一周从星期一的第一个时刻开始,一直持续到下个星期一的第一个时刻,但不包括下一个星期一的第一个时刻。
另外,我建议始终显式传递 ZoneId
,即使它是 ZoneId.systemDefault
,以使您的意图清晰明了。now
调整到星期一有一个问题,如果今天已经是星期一,该怎么办。使用在时间调整
中找到的以下两对时间调整实现中的任何一
种来指定您选择的行为:
示例代码。
ZonedDateTime now = ZonedDateTime.now( ZoneId.of( "Africa/Tunis" ) ) ; // Or `ZoneId.systemDefault()`.
ZonedDateTime weekStart = now.truncatedTo( ChronoUnit.DAYS ).with( TemporalAdjusters.previousOrSame( DayOfWeek.MONDAY ) );
ZonedDateTime weekStop = weekStart.plusWeeks( 1L ) ;
对于跟踪和调试,请始终生成一个字符串,该字符串使用标准 ISO 8601 格式(而不是问题所示的自定义格式)来表示日期时间对象的值。java.time 类在其方法中默认使用标准格式。toString
String outputStart = weekStart.toString() ;
String outputStop = weekStop.toString() ;
2018-06-18T00:00+01:00[非洲/突尼斯]
2018-06-25T00:00+01:00[非洲/突尼斯]
如果需要仅日期值,请使用 .LocalDateTime
您可以使用 ThreeTen-Extra 项目中找到的 或 类在单个对象中表示时间范围。LocalDateRange
Interval
最后提示:让java.time通过使用指定的方法自动本地化生成的字符串来完成繁重的工作,以确定人类语言和文化格式规范。DateTimeFormatter.ofLocalized…
Locale