如何将YYYYMMDDHHMMSS格式的日期转换为纪元或unix时间?

时间:2014-04-30 17:03:46

标签: java date

编辑:我已经编辑了我的问题以包含更多信息,我已经尝试了很多方法来做到这一点,在StackOverflow上问一个问题通常是我的最后一招。非常感谢任何帮助。

我有一个YYYYMMDDHHMMSS格式的日期(时间戳对象)(例如20140430193247)。这是从我的服务发送到前端,使用AngularJS格式显示它:date:'dd / MM / yyyy'。

如何将其转换为Epoch / Unix时间?

我已经尝试了与此相关的重复问题,我收到的是另一个日期。

我也尝试了以下内容:

A:

//_time == 20140430193247
return _time.getTime()/1000; // returns 20140430193 - INCORRECT

B:

return _time.getTime(); // returns 20140430193247 (Frontend: 23/03/2608) - INCORRECT

C:

Date date = new Date();
//_time = 20140501143245 (i.e. 05/01/2014 14:32:45)
String str = _time.toString();
System.out.println("Time string is " + str);
//Prints: Time string is 2608-03-24 15:39:03.245 meaning _time.toString() cannot be used
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
try {
        date = df.parse(str);
} catch (ParseException e) {
}

return date; // returns 20140501143245 - INCORRECT

d

date = new java.sql.Date(_time.getTime());
return date; // returns 2608-03-24 - INCORRECT

以下显示今天的日期:

Date date = new Date();
return date; // returns 1398939384523 (Frontend: 01/05/2014)

由于

2 个答案:

答案 0 :(得分:6)

经过不少尝试后,我得到了答案。解决方案非常简单 - 将时间解析为字符串,因为toString()没有工作。

    Date date;
    SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");

    try {
        date = df.parse(String.valueOf(_time.getTime()));
    } catch (ParseException e) {
        throw new RuntimeException("Failed to parse date: ", e);
    }

    return date.getTime();

答案 1 :(得分:1)

tl; dr

LocalDateTime
.parse(
    "20140430193247" , 
    DateTimeFormatter.ofPattern( "uuuuMMddHHmmss" )
)
.atOffset(
    ZoneOffset.UTC
)
.toEpochSecond()

java.time

将输入字符串解析为LocalDateTime,因为它缺乏从UTC偏移或时区的指示符。

String input = "20140430193247" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuuMMddHHmmss" ) ;
LocalDateTime ldt = LocalDateTime.parse( input , f ) ;

现在我们有一个日期,该日期是一天中的时间,大约是2014年4月30日晚上7点。但是,我们缺少偏移/区域的上下文。因此我们不知道这是日本东京的晚上7点还是美国俄亥俄州的托莱多的晚上7点,这两个不同的时刻相隔数小时。

要确定时刻,您必须知道预期的偏移量/区域。

如果可以肯定要使用零偏移量或UTC本身,请应用常数ZoneOffset.UTC以获得OffsetDateTime

OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC ) ;
  

如何将其转换为Epoch / Unix时间?

您是指从UTC 1970年第一刻起算起的秒数或毫秒数吗?

对于自1970-01-01T00:00Z以来的整秒计数,请询问OffsetDateTime对象。

long secondsSinceEpoch = odt.toEpochSecond() ;

以毫秒为单位,提取一个Instant对象。 Instant代表UTC的时刻,并且是 java.time 的基本构建模块类。然后询问计数。

Instant instant = odt.toInstant() ; 
long millisSinceEpoch = instant.toEpochMilli() ;