我试图通过使用java.text.SimpleDateFormat将String格式的日期转换为java.util.Date,但是它没有给我正确的输出。请帮忙!
我的输入是由Django date生成的:ex。 “2014-01-20T07:17:06.150995 + 00:00”
但是,我得到了“1月20日星期一15: 19:36 GMT + 08:00 2014”而不是“1月20日星期一15: 17:06 GMT + 08:00 2014“
这是我的测试代码:
String s = "2014-01-20T07:17:06.150995+00:00";
SimpleDateFormat sdf;
String fmt = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSZZZZZ";
sdf = new SimpleDateFormat(fmt, Locale.US);
String result = "";
try {
Date date = sdf.parse(s);
Log.d(Constants.LOG_TAG, date.toString());
result = date.toString();
} catch (Exception e) {
Log.d(Constants.LOG_TAG, "date formatting error" + e.getMessage());
}
Log.d(Constants.LOG_TAG, "date test >> " + result);
答案 0 :(得分:6)
正如您所看到的,您的两个日期相差2.5分钟。
这是因为您将微秒解析为毫秒。这将为您的结果添加150000毫秒,或2.5分钟。
使用SimpleDateFormat
没有标准方法用微秒解析日期字符串,如果无法以不同的格式获取源字符串,则必须自己完成。
如果日期始终采用这种格式,您可以执行以下操作:
String dateWithoutMicros = s.substring(0, s.length() - 9) + s.substring(s.length() - 6);
Date date = sdf.parse(dateWithoutMicros);
答案 1 :(得分:2)
当我第一次尝试运行你的代码(用System.out.println()替换Log.d)时,我得到了一个ParseException:Unparseable date。
接下来,我尝试了日期的几个部分及其各自的格式字符串部分。最后问题是时区部分" +00:00"分别为" ZZZZZ"。
我阅读了文档中的模式字母(http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html)并找到了:
Z - > -0800
X - > 08; -0800; -08:00
所以用X交换你的ZZZZZ然后它对我来说很好。
最终格式字符串:
String fmt = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSX";
答案 2 :(得分:1)
避免使用java.util.Date& .Calendar和java.text.SimpleTextFormat类。他们是出了名的麻烦。
使用第三方开源Joda-Time 2.3库,您可以将ISO 8601格式化的字符串直接传递给构造函数。不需要格式化程序和解析器。
但是,与java.util.Date一样,Joda-Time的分辨率为毫秒。所以它只能处理你的一小部分的前三位数。幸运的是,Joda-Time只是截断(忽略)后面的额外小数位而不是异常。
String s = "2014-01-20T07:17:06.150995+00:00";
DateTime dateTime = new DateTime( s );
System.out.println( "dateTime: " + dateTime );
System.out.println( "dateTime in UTC/GMT: " + dateTime.toDateTime( DateTimeZone.UTC ) );
跑步时......
dateTime: 2014-01-19T23:17:06.150-08:00
dateTime in UTC/GMT: 2014-01-20T07:17:06.150Z
java.time。*包中与Java 8捆绑在一起的新类取代了java.util.Date& .Calendar类。它们受到Joda-Time的启发,但完全重新设计。 JSR 310定义了这些类。
这些新类的分辨率为纳秒而不是毫秒,因此它们可以处理所有六个小数位。和Joda-Time一样,他们直接使用ISO 8601字符串。
String s = "2014-01-20T07:17:06.150995+00:00";
ZonedDateTime zdt = ZonedDateTime.parse( s );
System.out.println( "zdt: " + zdt );
跑步时......
zdt: 2014-01-20T07:17:06.150995Z