【问题标题】:How can I convert Date.toString back to Date?如何将 Date.toString 转换回 Date?
【发布时间】:2012-03-14 23:20:36
【问题描述】:

我有一个通过调用 Date 类实例的toString 方法获得的字符串。如何从该字符串中获取 Date 对象?

Date d = new Date();
String s = d.toString;
Date theSameDate = ...

更新

我尝试使用 SimpleDateFormat,但我得到了java.text.ParseException: Unparseable date Date.toString()产生的日期格式是什么?

【问题讨论】:

标签: java


【解决方案1】:
  1. 如果您的真正目标是序列化和反序列化日期和时间(例如,用于数据传输或持久性),请序列化为 ISO 8601,即日期和时间数据的标准格式。
  2. 跳过早已过时的Date 课程。被称为java.time 的现代Java 日期和时间API 使用起来要好得多。你需要的类可能是Instant(这取决于你更确切的要求)。

这两点相得益彰:

    Instant i = Instant.now();
    String s = i.toString();
    Instant theSameInstant = Instant.parse(s);

现代类的 toString 方法生成 ISO 8601 格式(例如,2018-01-11T10:59:45.036Z),它们的 parse 方法读取相同的格式。所以这个 sn-p 是你所需要的,你得到的瞬间等于第一个,精度为纳秒。

如果你无法控制你得到的字符串,并且你从Date.toString()得到结果,那么Sedalb’s answer中的格式模式字符串也适用于java.time

    DateTimeFormatter dtf 
            = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ROOT);
    Date d = new Date();
    String s = d.toString();
    Instant nearlyTheSameInstant = ZonedDateTime.parse(s, dtf).toInstant();

提供语言环境很重要。否则将使用 JVM 的默认语言环境,如果不是英语,则解析将失败。在最坏的情况下,您会看到您的代码运行良好多年,但当有一天有人在具有不同区域设置的计算机或设备上运行它时,它会突然中断。

jambjo’s answer 的观点仍然适用:Date.toString() 中使用的三个和四个字母的时区缩写通常非常不明确,因此不能保证时区被正确解释,同样,它在不同的 JVM 上会有不同的解释。

最后,Date.toString() 不会呈现 Date 所持有的毫秒数,这会导致高达 999 毫秒的不准确性。如果使用来自Date.toString() 的字符串,我们无能为力(这就是我将变量命名为nearlyTheSameInstant 的原因)。

【讨论】:

  • tl;dr Instant.parse( Instant.now().toString() )
【解决方案2】:

你可以这样做

Date d = new Date();
String s = d.toString;
Date theSameDate = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy").parse(s);

【讨论】:

  • 此方法在使用 bean 构造函数将 Java Date 对象与 JSONObjects 相互转换时也适用于 org.json 库,因为它在构造 JSONObjects 时使用 Date.toString()。谢谢你,这正是我正在寻找的 SimpleDateFormat 的格式。
  • 仅供参考,这里使用的麻烦的旧类现在是遗留的,被 java.time 类所取代。
  • 解释一下。要点/想法是什么?
【解决方案3】:

如果您的真正目标是序列化 Date 对象以进行某种定制的持久性或数据传输,一个简单的解决方案是:

Date d = new Date();
long l = d.getTime();
Date theSameDate = new Date(l);

【讨论】:

  • 仅供参考:麻烦的`Date` 类现在是遗留的,被Instant 和其他java.time 类取代。查看 Ole V.V. 的 this Answer 中的现代方法
【解决方案4】:

Date theSameDate = new Date(Date.parse(s));

由于一些不太明显的原因,这不是一个特别好的主意。您可以在 parse 方法的 API 文档中找到详细信息。一个问题是例如时区缩写不明确,因此解析器可能无法解释正确的时区。

【讨论】:

  • 另外Date.parse() 在很久以前就被弃用了。
【解决方案5】:

看看SimpleDateFormat#parse()。它应该提供您正在寻找的功能。

【讨论】:

  • 该类现在已被DateTimeFormatter 淘汰。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-28
  • 2019-09-05
  • 2015-05-23
  • 2023-03-26
  • 2017-03-24
  • 1970-01-01
  • 2021-12-22
相关资源
最近更新 更多