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

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

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

UPDATE
我试过使用SimpleDateFormat,但是我得到java.text.ParseException: Unparseable date你能告诉我Date.toString()生成的日期格式吗?

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

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

你可以这样做

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

看一下SimpleDateFormat #parse() 。 它应该提供您正在寻找的function。

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

这两点很好地携手并进:

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

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

如果你无法控制你得到的字符串,并且你从Date.toString()得到结果, 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(); 

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

来自jambjo的答案的观点仍然适用: Date.toString()中使用的三个和四个字母时区缩写经常是不明确的,因此不能保证时区被正确解释,并且再次,它将被不同地解释不同的JVM。

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

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

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