我有一个字符串,它通过调用Date类实例的toString
方法获得
如何从此字符串中获取Date对象?
Date d = new Date();
String s = d.toString;
Date theSameDate = ...
更新
我试过使用SimpleDateFormat,但我得到java.text.ParseException: Unparseable date
你能告诉我Date.toString()产生的日期格式吗?
答案 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)
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()
获得结果,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文档中找到有关该解析方法的详细信息。一个问题是例如时区缩写是不明确的,因此解析器可能无法解释正确的时区。