我试图通过使用java.text.simpledateformat将字符串格式的日期转换为java.util.date,但是它并没有给我正确的输出。请帮助!
我的输入是由django日期生成的: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);
,您可以看到两个日期不同2.5分钟。
发生这种情况是因为您将微秒解析为毫秒。这将为您的结果增加150000毫秒,即2.5分钟。
没有标准方法可以使用SimpleDateFormat
分析带有微秒的日期字符串,如果您无法以其他格式获得源字符串,则必须自己执行。
如果日期始终处于这种格式中,则可以做类似的事情:
String dateWithoutMicros = s.substring(0, s.length() - 9) + s.substring(s.length() - 6);
Date date = sdf.parse(dateWithoutMicros);
当我第一次尝试运行您的代码时(用system.out.println()替换为log.d),我得到了一个parseexception:无可避免的日期。
接下来,我尝试了日期的几个部分,其各自格式字符串零件。最后,问题是时区部分" 00:00" zzzzz"。
我在文档(http://docs.oracle.com/javase/7/docs/api/java/java/text/simpledateformat.html)中读取了有关图案字母的信息:
z-> -0800
X-> 08;-0800;-08:00
因此,用X交换了您的Zzzzz,然后对我来说很好。最终格式字符串:
String fmt = "yyyy-MM-dd'T'HH:mm:ss.SSSSSSX";
避免使用java.util.date&.calendar和java.text.simpletextformat类。众所周知,他们很麻烦。
Joda Time
使用第三方开源Joda Time 2.3库,您可以将ISO 8601格式字符串直接传递给构造函数。不需要格式和解析器。
但是,像java.util.date一样,joda time具有毫秒的分辨率。因此,它只能处理您一秒钟的前3位数字。但是,幸运的是,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.Time。*软件包,取代Java.util.date&.calendar类。它们的灵感来自Joda Time,但完全重新构建。JSR 310定义了这些类。
这些新类具有 nanseconds 而不是毫秒的分辨率,因此它们可以处理所有六个分数。像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