如何解析新的Date()。toString()的输出

时间:2011-01-17 13:45:59

标签: java date-format

我需要一个日期格式(也许是SimpleDateFormat),它可以解析我在Date对象上调用toString()时获得的输出。我的德语(!)系统的输出是:“Sun Dec 12 13:45:12 CET 2010”,所以它似乎并不尊重语言环境,这似乎很容易。

任何?

4 个答案:

答案 0 :(得分:28)

该格式在Date#toString()

中指定
  

将此Date对象转换为以下格式的String

dow mon dd hh:mm:ss zzz yyyy

所以,用SimpleDateFormat模式术语:

EEE MMM dd HH:mm:ss zzz yyyy

与此问题无关,我想知道使用Date#toString()而不是SimpleDateFormat#format()来输出日期是不是一个坏主意。我会考虑直接解决它。

答案 1 :(得分:6)

BalusC为您提供了正确的格式,我会说 - 不要。 toString()方法不得用于记录以外的任何内容。

您可以使用SimpleDateFormat进行格式化和解析。

答案 2 :(得分:1)

TL; DR

    Instant parsedBack = Instant.parse(Instant.now().toString());
    System.out.println(parsedBack);
  

2019-05-30T08:36:47.966274Z

使用ISO 8601和java.time

  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方法则返回相同的格式。因此,您只需使用此代码段,即可获得与第一个相同的瞬间,并具有纳秒级的精度。

如果您无法控制获得的字符串,并且从Date.toString()获得结果,那么BalusC的答案中的格式模式字符串也可以与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();

一些警告,但是:

  1. 原始Date的毫秒数丢失了,因为它们不在字符串中,从而导致长达999毫秒的不准确度(这就是为什么我将变量nearlyTheSameInstant命名为原因)。
  2. 原始Date中的时代也不在字符串中。因此,如果您的原始Date是在公元前44年,那么您将在公元44年得到相应的日期(在这种情况下,变量名nearlyTheSameInstant总是一个谎言)。
  3. 字符串中的时区缩写通常(最常见吗?)含糊不清,因此存在获取错误时区和错误时间的巨大风险。更糟糕的是,在不同的JVM上对时区缩写的解释会有所不同
  4. 提供语言环境至关重要。否则,将使用JVM的默认语言环境,如果不是英语,则解析将失败。在最坏的情况下,您会看到您的代码可以正常运行很多年,并且突然间,有一天有人在具有不同区域设置的计算机或设备上运行该代码时,它会中断。我将Locale.ROOT用作“非本地语言环境”或“不应用任何针对特定语言环境的处理”。这似乎是正确的方法。

链接

答案 3 :(得分:0)

您可以使用jdk8的 DateTimeFormatter

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();
    Date nearlyTheSameInstantDate = Date.from(nearlyTheSameInstant);
    DateTime dateTime = new DateTime(nearlyTheSameInstantDate);
    String str = dateTime.toString("yyyy/MM/dd");
    System.out.println("str = " + str);