Convert a date format in epoch
我有一个日期格式的字符串,如
1 | Jun 13 2003 23:11:52.454 UTC |
包含millisec ...我想在epoch中转换。
Java中是否有可用于执行此转换的实用程序?
此代码显示如何使用java.text.SimpleDateFormat从String解析java.util.Date:
1 2 3 4 5 | String str ="Jun 13 2003 23:11:52.454 UTC"; SimpleDateFormat df = new SimpleDateFormat("MMM dd yyyy HH:mm:ss.SSS zzz"); Date date = df.parse(str); long epoch = date.getTime(); System.out.println(epoch); // 1055545912454 |
您还可以使用新的Java 8 API
1 2 3 4 5 6 7 8 9 10 11 | import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; public class StackoverflowTest{ public static void main(String args[]){ String strDate ="Jun 13 2003 23:11:52.454 UTC"; DateTimeFormatter dtf = DateTimeFormatter.ofPattern("MMM dd yyyy HH:mm:ss.SSS zzz"); ZonedDateTime zdt = ZonedDateTime.parse(strDate,dtf); System.out.println(zdt.toInstant().toEpochMilli()); // 1055545912454 } } |
主要优点是您现在是线程安全的。
感谢Basil Bourque的评论和建议。阅读他的答案以获取全部细节。
TL;博士
1 2 3 4 5 6 | 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
本答案扩展了洛克尼的答案。
首先通过创建
1 2 | String input ="Jun 13 2003 23:11:52.454 UTC"; DateTimeFormatter f = DateTimeFormatter.ofPattern ("MMM d uuuu HH:mm:ss.SSS z" ); |
将字符串解析为
1 | ZonedDateTime zdt = ZonedDateTime.parse ("Jun 13 2003 23:11:52.454 UTC" , f ); |
zdt.toString(): 2003-06-13T23:11:52.454Z[UTC]
计数从历元
我不建议将日期时间值作为从纪元开始计算。这样做会使调试变得棘手,因为人类无法从数字中辨别出有意义的日期时间,因此无效/意外值可能会漏掉。此类计数也是模糊的,粒度(整秒,毫秒,微米,纳米等)和时期(各种计算机系统中至少二十几个)。
但是如果你坚持,你可以从1970年的第一个时刻(UTC(
1 | Instant instant = zdt.toInstant (); |
instant.toString(): 2003-06-13T23:11:52.454Z
1 | long millisSinceEpoch = instant.toEpochMilli() ; |
1055545912454
关于java.time
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧遗留日期时间类,例如
要了解更多信息,请参阅Oracle教程。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
您可以直接与数据库交换java.time对象。使用符合JDBC 4.2或更高版本的JDBC驱动程序。不需要字符串,不需要
从哪里获取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功能都被反向移植到Java 6& 7在ThreeTen-Backport。
-
Android的
- 更高版本的Android捆绑java.time类的实现。
- 对于早期的Android(<26),ThreeTenABP项目采用ThreeTen-Backport(如上所述)。请参见如何使用ThreeTenABP ....
ThreeTen-Extra项目使用其他类扩展了java.time。该项目是未来可能添加到java.time的试验场。您可以在这里找到一些有用的类,例如
1 2 3 4 5 6 7 8 | String dateTime="15-3-2019 09:50 AM" //time should be two digit like 08,09,10 DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd-MM-yyyy hh:mm a"); LocalDateTime zdt = LocalDateTime.parse(dateTime,dtf); LocalDateTime now = LocalDateTime.now(); ZoneId zone = ZoneId.of("Asia/Kolkata"); ZoneOffset zoneOffSet = zone.getRules().getOffset(now); long a= zdt.toInstant(zoneOffSet).toEpochMilli(); Log.d("time","---"+a); |
你可以从这个链接获得区域ID!
创建将字符串转换为日期格式的常用方法
1 2 3 4 5 6 7 8 9 10 11 12 | public static void main(String[] args) throws Exception { long test = ConvertStringToDate("May 26 10:41:23","MMM dd hh:mm:ss"); long test2 = ConvertStringToDate("Tue, Jun 06 2017, 12:30 AM","EEE, MMM dd yyyy, hh:mm a"); long test3 = ConvertStringToDate("Jun 13 2003 23:11:52.454 UTC","MMM dd yyyy HH:mm:ss.SSS zzz"); } private static long ConvertStringToDate(String dateString, String format) { try { return new SimpleDateFormat(format).parse(dateString).getTime(); } catch (ParseException e) {} return 0; } |