将字符串转换为日期

时间:2016-02-11 06:27:47

标签: java

我有这种格式的日期(星期二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

我该怎么转换呢?

4 个答案:

答案 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(或者如果我错了,请纠正我)。
  • 不同的日历 - 您可能已经对Gregorian,Julian或中国日历感到满意。如果在不同的日历中表达,同一时刻可能会有不同的日/月或年。幸运的是,大部分时间我们都在谈论格里高利历...

有一篇非常好的文章Date and time in Java更详细地描述了复杂性。

答案 1 :(得分:1)

格式不佳

字符串Thu Feb 11 00:00:00 GMT 530 2016显然格式不正确。我假设530offset-from-UTC。但它缺少+-,这是一个严重的遗漏。此外,虽然不是必需的,但建议在偏移的一位数小时填充零(05而不是5)。

仅供参考,+05:30是两个时区Asia/KolkataAsia/Colombo的时区。见this list。没有时区的偏移量为-05:30

我怀疑这个字符串可能实际上不是可解析的。在尝试解析之前,您需要操作输入字符串。如下所示,但如果输入字符串可能不同,则代码必须更加灵活。

String input = "Thu Feb 11 00:00:00 GMT 530 2016".replace ( "GMT 530" , "GMT+05:30" );

java.time

问题和其他答案使用旧的过时日期时间类。像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 );

ISO 8601

默认情况下,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();
}