在纪元中转换date格式

我有一个date格式的string,如

Jun 13 2003 23:11:52.454 UTC 

包含millisec …我想在时代转换。 有没有在Java我可以用来做这个转换的实用工具?

此代码显示了如何使用java.text.SimpleDateFormatparsingString中的java.util.Date :

 public static void main(String[] args) throws Exception { 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 } 

Date.getTime()以毫秒为单位返回纪元时间。

您也可以使用新的Java 8 API

 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 } } 

DateTimeFormatter类replace旧的SimpleDateFormat 。 然后,您可以创build一个ZonedDateTime ,从中可以提取所需的纪元时间。

主要优点是您现在是线程安全的。

感谢Basil Bourque的发言和build议。 详细阅读他的答案。

TL;博士

 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的答案 。

DateTimeFormatter

首先通过创build一个DateTimeFormatter对象来定义一个格式模式来匹配你的inputstring。

 String input = "Jun 13 2003 23:11:52.454 UTC"; DateTimeFormatter f = DateTimeFormatter.ofPattern ( "MMM d uuuu HH:mm:ss.SSS z" ); 

ZonedDateTime

将stringparsing为ZonedDateTime 。 你可以把这个类看作:( Instant + ZoneId )。

 ZonedDateTime zdt = ZonedDateTime.parse ( "Jun 13 2003 23:11:52.454 UTC" , f ); 

zdt.toString():2003-06-13T23:11:52.454Z [UTC]

计数从历元

我不build议跟踪date时间值作为从时间计数。 这样做会使debugging变得棘手,因为人们无法从数字中辨别出有意义的date时间,因此无效/意外的值可能会漏掉。 此外,这样的计数在粒度(整秒,毫秒,微米,纳米等)和时代(至less由各种计算机系统二十打)中是不明确的。

但是如果你坚持的话,你可以通过Instant类从1970年的第一个时刻( 1970-01-01T00:00:00 )得到一个毫秒数。 请注意,这意味着数据丢失,因为您正在将任何纳秒缩短到毫秒。

 Instant instant = zdt.toInstant (); 

instant.toString():2003-06-13T23:11:52.454Z

 long millisSinceEpoch = instant.toEpochMilli() ; 

1055545912454

关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧date时间类,如java.util.Date.Calendarjava.text.SimpleDateFormat

Joda-Time项目现在处于维护模式 ,build议迁移到java.time。

要了解更多信息,请参阅Oracle教程 。 并search堆栈溢出了很多例子和解释。

大部分的java.timefunction在ThreeTen-Backport中移植到Java 6&7中,并进一步适用于ThreeTenABP中的 Android (请参阅如何使用… )。

ThreeTen-Extra项目将java.time扩展到其他类。 这个项目是未来可能增加java.time的一个试验场。 你可能会在这里find一些有用的类,比如IntervalYearWeekYearQuarter 等等 。

创build通用方法将string转换为date格式

  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; }