我尝试通过以下方式转换此日期:
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)
答案 0 :(得分:4)
“-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));
答案 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