【发布时间】:2014-06-20 19:24:23
【问题描述】:
我尝试通过以下方式转换此日期:
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)
【问题讨论】:
我尝试通过以下方式转换此日期:
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)
【问题讨论】:
“-0500”是与 UTC 的偏移量,采用 RFC822 格式。你只需要Z,没有SSS。
Android SimpleDateFormat docs 在表中有这样的:
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));
【讨论】:
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
【讨论】: