tl;博士
LocalDate.of( 2014 , Month.NOVEMBER , 22 )
.atStartOfDay( ZoneId.of ( "Asia/Kolkata" ) )
.toInstant()
.toEpochMilli()
详情
Answer by Jon Skeet 是正确而明智的。
这是一些使用 java.time 类的示例代码。
LocalDate
LocalDate 类表示没有时间和时区的仅日期值。
时区对于确定日期至关重要。对于任何给定的时刻,日期在全球范围内因区域而异。例如,Paris France 中午夜后几分钟是新的一天,而 Montréal Québec 中仍然是“昨天”。
ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );
您可以指定LocalDate。
LocalDate ld = LocalDate.of( 2014 , Month.NOVEMBER , 22 );
ld.toString(): 2014-11-22
ZonedDateTime
您需要一个自纪元以来的毫秒数。我确实不建议使用从纪元开始计数来处理日期时间。但如果你坚持,我们就开始吧。
毫秒数意味着我们需要一个日期和一个时间。我们有个约会。我假设您希望将一天中的第一刻作为一天中的时间。 不要假设这次是00:00:00。夏令时 (DST) 等异常可能意味着一天从其他时间开始,例如 01:00:00。让 java.time 通过从 LocalDate 生成 ZonedDateTime 对象来确定第一个时刻。
LocalDate ld = LocalDate.of ( 2014 , Month.NOVEMBER , 22 );
ZoneId z = ZoneId.of ( "Asia/Kolkata" );
ZonedDateTime zdt = ld.atStartOfDay ( z );
zdt.toString(): 2014-11-22T00:00+05:30[亚洲/加尔各答]
Instant
如果需要,您可以提取 Instant。 Instant 类代表UTC 时间线上的时刻,分辨率为nanoseconds(最多九 (9) 位小数)。开发人员应该将 UTC 视为真正的时间,而不在工作时考虑他们自己的狭隘时区。
Instant instant = zdt.toInstant ();
instant.toString(): 2014-11-21T18:30:00Z
从那一刻起,我们就可以请求自纪元以来的毫秒数。请注意,这涉及数据丢失,因为任何纳秒都会被截断为毫秒。
long epochMillis = instant.toEpochMilli();
java.util.Date
我建议避免使用旧的日期时间类。但如果你必须,你可以转换。查看添加到旧类中的新方法,例如 java.util.Date。
java.util.Date utilDate = java.util.Date.from( instant );
关于java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、.Calendar 和 java.text.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。