【问题标题】:How can I convert a date in YYYYMMDDHHMMSS format to epoch or unix time?如何将 YYYYMMDDHHMMSS 格式的日期转换为纪元或 unix 时间?
【发布时间】:2014-06-17 02:58:50
【问题描述】:

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

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

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

我已经尝试过与此相关的重复问题,但返回的是不同的日期。

我也尝试了以下方法:

答:

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

乙:

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)

谢谢

【问题讨论】:

  • 那么到目前为止您尝试过什么? (提示:用于字符串解析的 SimpleDateFormat...)还要注意“特定格式的日期”不是 Timestamp 对象。如果你有一个Timestamp,你不能直接打电话给getTime()然后除以1000吗?
  • 另一个提示:你也需要一个时区。
  • 对“java 日期格式”的简单搜索将为您提供解决方案。在发布问题之前,请至少尝试一些研究。
  • Convert DATE Format to Epoch 的可能重复项
  • 这不是-6题,加油。

标签: java date


【解决方案1】:

在尝试了很长一段时间后,我得到了答案。解决方案非常简单 - 将时间解析为字符串,因为 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();

【讨论】:

  • 这些日期时间类很糟糕。现在已经过时,已被 JSR 310 中定义的现代 java.time 类所取代。
【解决方案2】:

tl;博士

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 时间?

您是指自 1970 年 UTC 第一刻以来的秒数或毫秒数?

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

long secondsSinceEpoch = odt.toEpochSecond() ;

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

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

【讨论】:

    猜你喜欢
    • 2014-01-25
    • 2020-05-24
    • 2011-02-14
    • 2016-09-15
    • 2015-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多