How can I get the start and end time of a period?
我有一个枚举
我正在尝试编写一个方法,它接收一个
我研究了新的Java 8 EDCOX1×5类,它可以占用一个启动时间和结束时间,但是似乎没有任何干净的方法来检索这些值。
如果不使用
不,
听起来基本上你应该创建一个有开始日期和结束日期的类。您仍然可以使用
时光流逝
小心传递"昨天"、"明天"等的枚举值。这引发了几个问题,时区和午夜。
日期和星期几仅在时区上下文中有意义。在任何特定的时刻,日期在全球各地都不尽相同。例如,巴黎午夜过后的几分钟仍然是蒙特利尔的"昨天"。因此,每当你打算"昨天"这样做时,也一定要指定所需/预期的时区。
每个非原子命令和代码行与前一个命令和代码行分别执行。每次执行都需要一段时间,无论时间多么短暂。在任何这些时刻,指定时区的午夜都可能转入新的一天。在午夜的那一刻,你的"昨天"等相对时间标志突然有了一个全新的含义。这一含义可能与早期代码所预期的不同,因为该代码开始时的条件(日期)不同。
所以对我来说,绕过
您不需要构建类或枚举来表示相对时间的意图,例如"昨天"。Java.Times类内置于Java 8和以后,具有用于添加和减去天、周、月的简单读取方法。这些基本上是一行程序,所以直接调用这些
1 2 3 | ZonedDateTime now = ZonedDateTime.now(); ZonedDateTime yesterday = now.minusDays( 1 ); ZonedDateTime weekLater = now.plusWeeks( 1 ); |
该代码隐式地应用了JVM的当前默认时区。最好具体说明。
1 2 | ZoneId zoneId = ZoneId.of("America/Montreal" ); ZonedDateTime now = ZonedDateTime.now( zoneId ); |
您可能只需要没有时间和时区的日期。使用
1 | LocalDate weekPrior = now.toLocalDate().minusWeeks( 1 ); |
你可能想得到一天中的第一个时刻。不一定是江户十一〔十三〕年的时候。
1 | ZonedDateTime yesterdayStart = now.minusDays( 1 ).toLocalDate().atStartOfDay( zoneId ); |
如果要表示由一对日期时间值定义的时间跨度,请查看扩展java.time框架的threeten extra项目中的
1 | Interval intervalYesterday = Interval.of( yesterdayStart.toInstant() , yesterdayStart.plusDays( 1 ).toInstant() ); |
要从
1 | ZonedDateTime zdt = ZonedDateTime( instant , zoneId ); |
对于仅限日期的间隔,您需要构建自己的类来存储一对
提示:搜索"半开放"以了解跟踪时间跨度的实践,其中从包含开始,而结束是独占的。