我尝试按照以下方式转换日期:
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)
Z
,不要SSS
。
Android SimpleDateFormat
文档中的表格如下:Z/ZZ/ZZZ
:-0800 ZZZZ
:GMT-08:00 ZZZZZ
:-08:00Locale.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));
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包(受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