读取"yyyy-MM-dd'T'HH:mm:ss.SSSSSSZZZZZ"时 java.text.SimpleDateFormat 的错误输出



我试图通过使用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

相关内容

  • 没有找到相关文章

最新更新