我需要一个日期格式(也许是SimpleDateFormat),它可以解析我在Date对象上调用toString()时获得的输出。我的德语(!)系统的输出是:“Sun Dec 12 13:45:12 CET 2010”,所以它似乎并不尊重语言环境,这似乎很容易。
任何?
答案 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)
Instant parsedBack = Instant.parse(Instant.now().toString());
System.out.println(parsedBack);
2019-05-30T08:36:47.966274Z
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();
一些警告,但是:
Date
的毫秒数丢失了,因为它们不在字符串中,从而导致长达999毫秒的不准确度(这就是为什么我将变量nearlyTheSameInstant
命名为原因)。Date
中的时代也不在字符串中。因此,如果您的原始Date
是在公元前44年,那么您将在公元44年得到相应的日期(在这种情况下,变量名nearlyTheSameInstant
总是一个谎言)。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);