java 一天的开始时间和结束时间_java – 如何获取一天的开始时间和结束时间?...

半开

answer by mprivat是正确的。他的观点是不试图获得一天的结束,而是相比“第二天开始之前”。他的想法被称为“半开放”方法,其中时间跨度具有包容性的开始,而结束是排他性的。

>当前日期时间框架是Java(java.util.Date/Calendar和Joda-Time)都使用从epoch的毫秒。但在Java 8中,新的JSR 310 java.time。*类使用纳秒分辨率。任何代码,如果切换到新的类,基于强制毫秒计数的最后一天的时间将是不正确的。

>比较来自其他来源的数据如果使用其他分辨率,则会出现故障。例如,Unix库通常使用整秒,而数据库(如Postgres)将日期时间解析为微秒。

>一些夏令时变化发生在午夜,这可能进一步混淆事情。

Joda-Time 2.3提供了一个方法来达到这个目的,获得一天的第一时刻:withTimeAtStartOfDay().同样在java.time,LocalDate :: atStartOfDay。

避免使用旧日期时间类

java.util.Date和.Calendar类是众所周知的麻烦。避免他们。

使用Joda-Time或者最好是java.time. java.time框架是高度成功的Joda-Time库的官方继承者。

java.time

java.time框架内置在Java 8和更高版本中。支持Java 6& 7在ThreeTen-Backport项目中,进一步适应Android在ThreeTenABP项目。

Instant instant = Instant.now();

ZoneId zoneId = ZoneId.of( "America/Montreal" );

ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

ZonedDateTime zdtStart = zdt.toLocalDate().atStartOfDay( zoneId );

使用半开放方法,获得第二天的第一刻。

ZonedDateTime zdtTomorrowStart = zdtStart.plusDays( 1 );

目前java.time框架缺少一个Interval类,如下面Joda-Time所述。但是,ThreeTen-Extra项目使用附加类扩展了java.time。这个项目是将来可能增加java.time的证明。其中的类是Interval.通过传递一对Instant对象来构造一个间隔。我们可以从我们的ZonedDateTime对象中提取一个Instant。

Interval today = Interval.of( zdtStart.toInstant() , zdtTomorrowStart.toInstant() );

Joda时间

Joda-Time有三个类,以不同的方式表示时间跨度:间隔,周期和持续时间。间隔具有特定的开始和结束于宇宙的时间线。这符合我们代表“一天”的需要。

我们使用TimeAtStartOfDay调用方法,而不是将时间设置为零。由于夏令时和其他异常,一天的第一时刻可能不是00:00:00。

使用Joda-Time 2.3的示例代码。

DateTimeZone timeZone = DateTimeZone.forID( "America/Montreal" );

DateTime now = DateTime.now( timeZone );

DateTime todayStart = now.withTimeAtStartOfDay();

DateTime tomorrowStart = now.plusDays( 1 ).withTimeAtStartOfDay();

Interval today = new Interval( todayStart, tomorrowStart );

如果必须,您可以转换为java.util.Date。

java.util.Date date = todayStart.toDate();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值