这个" date":" 2014-08-20 00:00:00 -0500"的时间格式是什么?

时间:2014-06-20 19:24:24

标签: java android date

我尝试通过以下方式转换此日期:

SimpleDateFormat fromFormat  = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSSZ");

但我得到了:

 java.text.ParseException: Unparseable date: "2014-09-20 00:00:00 -0500" (at offset 20)

2 个答案:

答案 0 :(得分:4)

“-0500”是UTC的偏移量,采用RFC822格式。您只需要Z,而不需要SSS

Android SimpleDateFormat docs表格中有这样的内容:

  • 符号:Z
  • 含义:时区(RFC 822)
  • 种类:(时区)
  • 示例:Z/ZZ/ZZZ: - 0800 ZZZZ:GMT-08:00 ZZZZZ: - 08:00

我个人也会指定一个区域设置,理所当然:这是一种机器可读的格式而不是面向人的格式,所以我通常会指定Locale.US

SimpleDateFormat format  = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z",
                                                Locale.US);
String text = "2014-08-20 00:00:00 -0500";
System.out.println(format.parse(text));

答案 1 :(得分:1)

answer by Jon Skeet是正确的。

标准日期时间格式

以下是一些示例代码,说明如何将字符串转换为符合ISO 8601

String inputRaw = "2014-08-20 00:00:00 -0500";
String input = inputRaw.replaceFirst( " ", "T" ).replaceFirst( " ", "" ); // Replace first SPACE with a 'T', and delete second SPACE.
// input is "2014-08-20T00:00:00-0500".

约达时间

您可以将该兼容字符串直接传递给Joda-Time中DateTime的构造函数。同样在Java 8中的java.time package(受Joda-Time启发)。

DateTimeZone timeZone = DateTimeZone.forID( "America/Montreal" ); // Specify it rather than have JVM's default applied.
DateTime dateTimeMontréal = new DateTime( input, timeZone );
DateTime dateTimeUtc = dateTimeMontréal.withZone( DateTimeZone.UTC );

转储到控制台。

System.out.println( "inputRaw: " + inputRaw );
System.out.println( "input: " + input );
System.out.println( "dateTimeMontréal: " + dateTimeMontréal );
System.out.println( "dateTimeUtc: " + dateTimeUtc );

跑步时......

inputRaw: 2014-08-20 00:00:00 -0500
input: 2014-08-20T00:00:00-0500
dateTimeMontréal: 2014-08-20T01:00:00.000-04:00
dateTimeUtc: 2014-08-20T05:00:00.000Z