在纪元中转换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
, .Calendar
和java.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一些有用的类,比如Interval
, YearWeek
, YearQuarter
等等 。
创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; }