tl;博士
ZonedDateTime.of(
LocalDate.of( 2015 , Month.JANUARY , 8 ) ,
LocalTime.of( 7 , 13 , 0 ) ,
ZoneId.of( "Africa/Tunis" )
)
.toInstant()
.toEpochMilli()
1420697580000
java.time
现代方法使用 java.time 类来取代麻烦的旧旧日期时间类。 所以现在更容易和更清洁了。
您的代码不明确,因为您没有解决时区的关键问题。由于您没有明确指定时区,因此您的 JVM 当前的默认时区将被隐式应用。我强烈建议始终指定您想要/预期的时区。
以continent/region 的格式指定proper time zone name,例如America/Montreal、Africa/Casablanca 或Pacific/Auckland。切勿使用 3-4 个字母的伪时区,例如 EST 或 IST,因为它们不是真正的时区,没有标准化,甚至不是唯一的(!)。
LocalDate ld = LocalDate.of( 2015 , Month.JANUARY , 8 ) ;
LocalTime lt = LocalTime.of( 7 , 13 , 0 ) ;
ZoneId z = ZoneId.of( "Pacific/Auckland" ) ;
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;
您也可以使用组合因子方法。
ZonedDateTime zdt = ZonedDateTime.of( 2015 , Month.JANUARY , 8 , 7 , 13 , 0 , 0 , ZoneId.of( "Pacific/Auckland" ) ) ;
我通常建议不要将日期时间作为从纪元开始的计数。但这似乎是您的情况的要求。
首先我们可以提取Instant,UTC 时刻。 Instant 类代表UTC 时间线上的时刻,分辨率为nanoseconds(最多九 (9) 位小数)。
Instant instant = zdt.toInstant() ; // Convert from a zoned value to a UTC value.
然后,您可以询问自 1970 年第一刻(UTC,1970-01-01T00:00:00Z)的纪元参考以来的毫秒数。请注意可能的数据丢失,因为Instant 中的任何微秒或纳秒在报告毫秒时都将被忽略。
long millis = instant.toEpochMilli() ; // Count of milliseconds since 1970-01-01T00:00:00Z.
关于java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。
Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
使用符合JDBC 4.2 或更高版本的JDBC driver,您可以直接与您的数据库交换java.time 对象。不需要字符串也不需要 java.sql.* 类。
从哪里获得 java.time 类?
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。