TL;博士
>将格式模式从kk更改为HH.
>你加一分钟是无关紧要的.
2018-06-18 24:01
…变为:
2018-06-18 00:01
提示:调试时,请使用默认的标准ISO 8601格式生成字符串.
ZonedDateTime.now(
ZoneId.of( "Africa/Tunis" )
)
.truncatedTo( ChronoUnit.DAYS )
.with(
TemporalAdjusters.previousOrSame( DayOfWeek.MONDAY )
)
.toString()
2018-06-18T00:00+01:00[Africa/Tunis]
k = 1-24小时(实际上是24-23)
deleted Answer by Jorn Vernee是正确的:你正在使用k,它被记录为使用从1到24运行的24小时时钟来表示时间.
在文档中不太清楚的是,第一个小时被计为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,异常,非标准,并且不常用. See Wikipedia.显然,这种风格偶尔用于某些特殊环境,其中营业时间超过午夜,如广播.
至于你的期望……
it should be 00:01 in a 24 hour clock representation.
如果您想要0-23,请使用“H”,as documented.
首先,查看默认的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[America/Los_Angeles]
2018-06-24T00:01-07:00[America/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,以使您的意图清晰.
调整到星期一有一个问题,如果今天已经是星期一该怎么办.使用TemporalAdjusters中的这对TemporalAdjuster实现中的任何一个来指定您的行为选择:
示例代码.
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格式生成表示日期时间对象值的String,而不是如您的问题所示的自定义格式.默认情况下,java.time类在其toString方法中使用标准格式.
String outputStart = weekStart.toString() ;
String outputStop = weekStop.toString() ;
2018-06-18T00:00+01:00[Africa/Tunis]
2018-06-25T00:00+01:00[Africa/Tunis]
如果您想要仅限日期的值,请使用LocalDateTime.
您可以使用ThreeTen-Extra项目中的LocalDateRange或Interval类在单个对象中表示您的时间范围.
最后提示:让java.time通过使用DateTimeFormatter.ofLocalized …方法来执行繁重工作,以使用指定的Locale自动本地化生成的字符串,以确定人类语言和格式化的文化规范.