如何将Date.toString转换回日期?

use*_*208 8 java

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

Date d = new Date();
String s = d.toString;
Date theSameDate = ...
Run Code Online (Sandbox Code Playgroud)

更新
我尝试使用SimpleDateFormat,但是我知道java.text.ParseException: Unparseable date 你能告诉我Date.toString()生成的日期格式吗?

fle*_*esk 16

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

Date d = new Date();
long l = d.getTime();
Date theSameDate = new Date(l);
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考:麻烦的`Date`类现在已经遗留下来,取而代之的是"Instant"和其他*java.time*类.请参阅Ole VV的[本答案](https://en.m.wikipedia.org/wiki/ISO_8601)中的现代方法 (2认同)

小智 12

你可以这样做

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


Ole*_*.V. 6

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

这两点很好地相辅相成:

    Instant i = Instant.now();
    String s = i.toString();
    Instant theSameInstant = Instant.parse(s);
Run Code Online (Sandbox Code Playgroud)

现代类的toString方法产生 ISO 8601 格式(例如,2018-01-11T10:59:45.036Z),并且它们的parse方法读回相同的格式。所以这个片段就是你所需要的,你会得到一个与第一个相同的时刻,精度为纳秒。

如果你无法控制你的字符串,你得到的结果Date.toString(),格式模式字符串Sedalb的答案可与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();
Run Code Online (Sandbox Code Playgroud)

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

从点jambjo的回答仍然适用:在使用的三个和四个字母时区的缩写Date.toString()经常模棱两可,所以没有保证时区正确解释,并再次,它会在不同的不同的JVM解释。

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

  • tl;博士`Instant.parse(Instant.now().toString())` (2认同)