我有这种格式的日期(星期二11月11日00:00:00 GMT 530 2016),这是一个字符串,我想将其转换为简单的日期格式(dd / mm / yyyy)。
我使用了以下代码,但它不起作用:
SimpleDateFormat fmt123 = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");
try {
refDt = fmt123.parse(refDate);
logger.log(Level.SEVERE, "date after parsing "+refDt);
}
catch (ParseException e1) {
e1.printStackTrace();
}
它给我结果:Tue Feb 12 00:00:00 UTC 530
我该怎么转换呢?
答案 0 :(得分:1)
您想要实现的目标是两个步骤。
第1步 - 解析现有字符串
你非常接近,但是你已经注意到530部分(我猜它是毫秒)被解析为年份。
使用以下代码创建用于解析的SimpleDateFormat
实例
new SimpleDateFormat("EEE MMM dd HH:mm:ss z SSS yyyy")
第2步 - 格式化
解析完日期对象后,您需要将其呈现给用户。通常,您将使用new SimpleDateFormat("dd/MM/yyyy")
并使用它来输出日期。这将使用您的本地计算机设置(例如时区)来进行格式化。通常就足够了。
但这要复杂得多......
2 AM, 11 Feb 2016 in Europe/Amsterdam
8 PM, 10 Feb 2016 in America/Boston
(或者如果我错了,请纠正我)。 有一篇非常好的文章Date and time in Java更详细地描述了复杂性。
答案 1 :(得分:1)
字符串Thu Feb 11 00:00:00 GMT 530 2016
显然格式不正确。我假设530
是offset-from-UTC。但它缺少+
或-
,这是一个严重的遗漏。此外,虽然不是必需的,但建议在偏移的一位数小时填充零(05
而不是5
)。
仅供参考,+05:30
是两个时区Asia/Kolkata
和Asia/Colombo
的时区。见this list。没有时区的偏移量为-05:30
。
我怀疑这个字符串可能实际上不是可解析的。在尝试解析之前,您需要操作输入字符串。如下所示,但如果输入字符串可能不同,则代码必须更加灵活。
String input = "Thu Feb 11 00:00:00 GMT 530 2016".replace ( "GMT 530" , "GMT+05:30" );
问题和其他答案使用旧的过时日期时间类。像java.util.Date/.Calendar&这样的类。 java.text.SimpleDateFormat已被Java 8及更高版本中内置的java.time框架所取代。
java.time中的格式化程序代码与SimpleTextFormat的格式化程序代码略有不同。一定要阅读文档。
String input = "Thu Feb 11 00:00:00 GMT 530 2016".replace ( "GMT 530" , "GMT+05:30" );
DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "EEE MMM dd HH:mm:ss z uuuu" );
ZonedDateTime zdtGmt = ZonedDateTime.parse ( input , formatter );
默认情况下,java.time类在toString
方法实现中使用ISO 8601格式。
String output = zdtGmt.toString ();
让我们调整到Asia/Kolkata
而不是GMT
的特定时区。时区是与UTC 的偏移量加上一组过去,现在和将来的异常调整规则,例如夏令时。
ZonedDateTime zdtAsiaKolkata = zdtGmt.withZoneSameInstant ( ZoneId.of ( "Asia/Kolkata" ) );
转储到控制台。
System.out.println ( "input: " + input + " | zdtGmt: " + zdtGmt + " | output: " + output + " | zdtAsiaKolkata: " + zdtAsiaKolkata );
输入:2月11日星期四00:00:00 GMT + 05:30 2016 | zdtGmt:2016-02-11T00:00 + 05:30 [GMT + 05:30] |输出:2016-02-11T00:00 + 05:30 [GMT + 05:30] | zdtAsiaKolkata:2016-02-11T00:00 + 05:30 [亚洲/加尔各答]
答案 2 :(得分:0)
您的格式
SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy");
应与您的输入相匹配
"Thu Feb 11 00:00:00 GMT 530 2016"
正如评论中所提到的,这导致解析者认为530是年份,而忽略了其余部分。
有关详细信息,请参阅SimpleDateFormat。
答案 3 :(得分:-2)
SimpleDateFormat fmt123 = new SimpleDateFormat("E MMM dd HH:mm:ss Z yyyy");
try {
refDt = fmt123.parse(refDate);
logger.log(Level.SEVERE, "date after parsing "+refDt);
}
catch (ParseException e1) {
e1.printStackTrace();
}