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

时间:2012-02-24 13:56:32

标签: java

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

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

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

5 个答案:

答案 0 :(得分:14)

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

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

答案 1 :(得分:10)

你可以这样做

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

答案 2 :(得分:2)

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

答案 3 :(得分:2)

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

        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()获得结果,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)的原因。

答案 4 :(得分:-1)

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

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