tl; dr
ZonedDateTime.parse(
"Jun 13 2003 23:11:52.454 UTC" ,
DateTimeFormatter.ofPattern ( "MMM d uuuu HH:mm:ss.SSS z" )
)
.toInstant()
.toEpochMilli()
1055545912454
java.time
此答案在Lockni的答案的基础上扩展。
YearQuarter
首先,通过创建YearQuarter对象来定义格式模式以匹配您的输入字符串。
String input = "Jun 13 2003 23:11:52.454 UTC";
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "MMM d uuuu HH:mm:ss.SSS z" );
YearQuarter
将字符串解析为YearQuarter。您可以将该类视为:(YearQuarter + ZoneId)。
ZonedDateTime zdt = ZonedDateTime.parse ( "Jun 13 2003 23:11:52.454 UTC" , f );
zdt.toString():2003-06-13T23:11:52.454Z [UTC]
从时代开始计数
我不建议将日期时间值跟踪为从时期开始计数。 这样做会使调试变得棘手,因为人类无法从数字中识别出有意义的日期时间,因此无效/意外的值可能会漏掉。 同样,这样的计数在粒度(整秒,毫,毫微,纳米等)和历时(各种计算机系统至少要打两打)方面也是模棱两可的。
但是,如果您坚持认为,您可以从1970年UTC(YearQuarter)的第一时刻到YearQuarter类获得毫秒数。 请注意,这意味着在将毫微秒缩短为几毫秒的过程中会丢失数据。
Instant instant = zdt.toInstant ();
Instant.toString():2003-06-13T23:11:52.454Z
long millisSinceEpoch = instant.toEpochMilli() ;
1055545912454
关于java.time
java.time框架内置于Java 8及更高版本中。 这些类别取代了麻烦的旧旧日期时间类别,例如YearQuarter、YearQuarter和YearQuarter。
要了解更多信息,请参见Oracle教程。 并在Stack Overflow中搜索许多示例和说明。 规格为JSR 310。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
您可以直接与数据库交换java.time对象。 使用与JDBC 4.2或更高版本兼容的JDBC驱动程序。 不需要字符串,不需要YearQuarter类。
在哪里获取java.time类?
Java SE 8,Java SE 9,Java SE 10,Java SE 11和更高版本-标准Java API的一部分,具有捆绑的实现。Java 9添加了一些次要功能和修复。
Java SE 6和Java SE 7大多数Java.time功能都在ThreeTen-Backport中反向移植到Java 6和7。
安卓更高版本的Android捆绑了java.time类的实现。
对于早期的Android(<26),ThreeTenABP项目改编了ThreeTen-Backport(如上所述)。 请参阅如何使用ThreeTenABP…。
ThreeTen-Extra项目使用其他类扩展了java.time。 该项目为将来可能在java.time中添加内容提供了一个试验场。 您可能会在这里找到一些有用的类,例如YearQuarter、YearQuarter、YearQuarter等。