java 数组 jorn_为什么Java 8 ZonedDateTime认为24:01是一个有效...

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自动本地化生成的字符串,以确定人类语言和格式化的文化规范.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值