在Java中保留时间戳详细信息

时间:2020-01-23 20:40:32

标签: java datetime

我有一个输入字符串 2020-01-21T02:16:51.8320Z

我需要将此字符串解析为java Date对象。

我尝试使用以下代码。

LocalDate localDate = LocalDate.parse(date, flexUtcDtf);
return Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());

输出: 2020年1月22日星期三00:00:00

是否可以代替以下Date对象获取输出?(即也保留时间细节) 2020年1月21日星期三02:46:51.8320

谢谢。

2 个答案:

答案 0 :(得分:2)

java.util.Date
.from(
    Instant.parse(
        "2020-01-21T02:16:51.8320Z"
    )
)
.toString()

当心数据丢失。您输入的内容小数点后第四位。这意味着微秒。 Instant类可以解决这个问题。但是您要求的旧式Date类不能,并且限制为毫秒。因此,任何微秒都会被截断,被截断为毫秒。

已经为可怕的旧类(例如java.util.Date)提供了新方法,以方便在现代 java.time 类之间来回转换。在这里,我们使用Date.from( Instant )来根据从您的输入中解析出来的现代Instant生成一个遗留日期。

请注意, Date有很多缺陷和问题。其中包括其toString方法的行为。该方法采用Date的值(在UTC中是一刻),然后在生成文本时应用JVM的当前默认时区。这会造成该时区是Date一部分的错觉。

我建议您完全避免使用Date ,而仅使用 java.time 类。但是我的代码在这里按照要求回答了问题。

此外,您想要的输出格式是一种糟糕的格式。而是使用ISO 8601 标准格式进行数据交换。为了向用户展示,请使用DateTimeFormatter.ofLocalizedDateTime。这两个主题都已在Stack Overflow上讨论过很多次,因此请搜索以了解更多信息。

答案 1 :(得分:1)

首先-祝贺您使用Java 8时间函数-明智的选择!

根据您的问题:

  1. 这是将“ LocalDate”转换为“ java.util.Date”的方法:

    Date myDate =  Date.from(localDate.atZone(ZoneId.systemDefault()).toInstant());
    
    ... or ...
    
    Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
    

根据文档:

https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html

LocalDate是不可变的日期时间对象,代表日期, 通常被视为年月日。其他日期字段,例如 还可以访问每年的一天,每周的一天和每年的一周。对于 例如,值“ 2007年10月2日”可以存储在LocalDate中。

此类不存储或表示时间或时区。代替, 它是日期的描述,用于生日。这不可以 表示时间轴上的瞬间而没有其他信息 例如偏移量或时区。

  1. 所以更好的选择可能是LocalDateTime

  2. 在两种情况下,“ java.util.Date”都会自动具有“所需的一切”。它是一个“日期/时间”对象。它存储日期和时间,与任何时区无关。

相关问题