tl;博士
如果您是指 UTC 中的午夜在旧的遗留 java.util.Date 对象中......
java.util.Date.from(
OffsetDateTime.of(
LocalDate.of( 2017 , Month.JANUARY , 23 ) ,
LocalTime.MIN ,
ZoneOffset.UTC
).toInstant()
)
如果可能,丢弃上面的旧版Date 部分,只使用现代的java.time.OffsetDateTime 或java.time.Instant 对象...
OffsetDateTime.of(
LocalDate.of( 2017 , Month.JANUARY , 23 ) ,
LocalTime.MIN ,
ZoneOffset.UTC
).toInstant()
如果您指的是 particular time zone 的午夜而不是 UTC……
LocalDate.now()
.atStartOfDay()
最好指定您想要/预期的时区,而不是隐式依赖当前默认值。
LocalDate.now( ZoneId.of( "Pacific/Auckland" ) )
.atStartOfDay( ZoneId.of( "Pacific/Auckland" ) )
详情
警告:并非每个时区的每一天都有 00:00:00 的时间。夏令时可以跳到凌晨 1 点,消除午夜。
java.time
使用 java.time 类来替代麻烦的旧日期时间类,例如 java.util.Date 和 .Calendar。
ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate localDate = LocalDate.now( z );
ZonedDateTime zdt = localDate.atStartOfDay( z );
转换为/从遗留类
您应该尽可能坚持使用现代 java.time 类。但是如果你必须有旧的遗留类的实例,你可以转换到/从 java.time。查看添加到旧类的新方法。
Calendar myLegacyCal = GregorianCalendar.from( zdt ) ;
Date myLegacyDate = Date.from( zdt.toInstant() ) ;
如果您希望 java.util.Date(始终位于 UTC 时区)的时间为 00:00:00,请使用 OffsetDateTime 和常量 ZoneOffset.UTC。
OffsetDateTime odt = OffsetDateTime.of( localDate , LocalTime.MIN , ZoneOffset.UTC ) ;
Date myLegacyDate = Date.from( odt.toInstant() ) ;
关于java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。
Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
从哪里获得 java.time 类?
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。
乔达时间
更新:Joda-Time 项目现在处于维护模式。该团队建议迁移到 java.time 类。这部分作为历史原封不动地保留下来。
使用Joda-Time 2.3,为此目的使用一个方法:withTimeAtStartOfDay()。
// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.
// import org.joda.time.*;
DateTime now = new DateTime();
DateTime firstMomentOfToday = now.withTimeAtStartOfDay();
System.out.println( "now: " + now );
System.out.println( "firstMomentOfToday: " + firstMomentOfToday );
运行时……
now: 2013-12-05T23:00:23.785-08:00
firstMomentOfToday: 2013-12-05T00:00:00.000-08:00