在epoch中转换日期格式

use*_*979 55 java datetime date epoch

我有一个日期格式的字符串,如

Jun 13 2003 23:11:52.454 UTC
Run Code Online (Sandbox Code Playgroud)

包含millisec ...我想在epoch中转换.Java中是否有可用于执行此转换的实用程序?

Boh*_*ian 92

此代码显示如何使用java.text.SimpleDateFormat从String 解析java.util.Date:

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
Run Code Online (Sandbox Code Playgroud)

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


Ort*_*kni 22

您还可以使用新的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  
    }
}
Run Code Online (Sandbox Code Playgroud)

DateTimeFormatter类取代了旧的SimpleDateFormat.然后ZonedDateTime,您可以创建一个可以从中提取所需纪元时间的文件.

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

感谢Basil Bourque的评论和建议.阅读他的答案以获取全部细节.


Bas*_*que 8

TL;博士

ZonedDateTime.parse( 
                        "Jun 13 2003 23:11:52.454 UTC" , 
                        DateTimeFormatter.ofPattern ( "MMM d uuuu HH:mm:ss.SSS z" ) 
                    )
              .toInstant()
              .toEpochMilli()
Run Code Online (Sandbox Code Playgroud)

1055545912454

java.time

本答案扩展了洛克尼答案.

DateTimeFormatter

首先通过创建DateTimeFormatter对象来定义格式化模式以匹配输入字符串.

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

ZonedDateTime

将字符串解析为ZonedDateTime.您可以将该类视为:(Instant+ ZoneId).

ZonedDateTime zdt = ZonedDateTime.parse ( "Jun 13 2003 23:11:52.454 UTC" , f );
Run Code Online (Sandbox Code Playgroud)

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

计数从历元

我不建议将日期时间值作为从纪元开始计算.这样做会使调试变得棘手,因为人类无法从数字中辨别出有意义的日期时间,因此无效/意外值可能会漏掉.此类计数也是模糊的,粒度(整秒,毫秒,微米,纳米等)和时期(各种计算机系统中至少二十几个).

但是,如果你坚持,你可以从UTC(1970-01-01T00:00:00)的1970年第一时刻到整个Instant班级获得毫秒数.请注意,这意味着数据丢失,因为您将任何纳秒缩短为毫秒.

Instant instant = zdt.toInstant ();
Run Code Online (Sandbox Code Playgroud)

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

long millisSinceEpoch = instant.toEpochMilli() ; 
Run Code Online (Sandbox Code Playgroud)

1055545912454


关于java.time

java.time框架是建立在Java 8和更高版本.这些类取代麻烦的老传统日期时间类,如java.util.Date,Calendar,和SimpleDateFormat.

要了解更多信息,请参阅Oracle教程.并搜索Stack Overflow以获取许多示例和解释.规范是JSR 310.

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

您可以直接与数据库交换java.time对象.使用符合JDBC 4.2或更高版本的JDBC驱动程序.不需要字符串,不需要课程.java.sql.*

从哪里获取java.time类?

ThreeTen-额外项目与其他类扩展java.time.该项目是未来可能添加到java.time的试验场.您可以在此比如找到一些有用的类Interval,YearWeek,YearQuarter,和更多.