繁体   English   中英

Java无法解析的日期

[英]Java Unparsable date

我有一个格式如下的String dateString = "2014-03-17T20:05:49.2300963Z"String dateString = "2014-03-17T20:05:49.2300963Z"

试试这个:

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'kk:mm:ss.SSSX");
Date date = df.parse(dateString);

导致不可Unparsable date除外。

docs: http : //docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html表示当TimeZone使用单个字母时, ISO 8601X一起使用。

编辑重新阅读文档后,我稍微切换了SimpleDateFormat

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
dateString = dateString.replace("Z", "");

我拿出Z是因为我知道时区,使用H而不是k并为傻笑添加更多S

现在时间正在解析,但是不正确。 日期是准确的,时间似乎是随机的。

编辑2问题是Java只允许毫秒精度,因此2300963被解释为2300秒和963毫秒。 我需要对字符串进行一些不同的格式化才能使其正常工作。

编辑3事实证明,在Java中,您不可能有几分之一秒的时间。 它必须被截断为毫秒。 我最终使用了数据库可以使用的类型,但是一般的解决方案是将秒的小数部分截断为毫秒。 我将发布示例代码作为答案。

您需要在String日期中提供尽可能多的S 在这种情况下,7

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'kk:mm:ss.SSSSSSSX");

这是必需的,因为否则, DateFormat不知道毫秒在哪里结束以及时区在哪里开始。


另请注意,

2300963

毫秒值表示2300秒和963毫秒。 为什么这样呢? 为什么这些秒数不属于相应位置的值? DateFormat解析时,将添加它们。

这有效: SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'kk:mm:ss.SSSSSSS'Z'");

  1. 确切指定期望的精度是比较安全的(例如,在这种情况下为毫秒)。 7位数字很奇怪,但是如果您所有的日期都像这样,请输入7 S
  2. X将解析一个时区-0800 因此,您的字符串必须看起来像2014-03-17T20:05:49.2300963-0800 (或类似名称)。 Z视为文字,如T

编辑与您的部分秒数问题有关

如何将小数秒截断为毫秒(因为Java无法处理小数秒):

public String truncate(String dateString){
  int numberOfDigits = dateString.substring(dateString.indexOf("."), dateString.length() - 1).length();

  String justMilliSecondsDate = null;
  if (numberOfDigits == 3) {
    justMicrosDate = dateString;
    } 
  else if (numberOfDigits > 3) {
    justMilliSecondsDate = dateString.substring(0, dateString.length() - numberOfDigits + 3);
  } 
  else {
      justMilliSecondsDate = dateString;
      for (int i = numberOfDigits ; i < 3 ; i++) justMilliSecondsDate += "0";
  }

  return justMilliSecondsDate;
}

TL;博士

Instant.parse( "2014-03-17T20:05:49.2300963Z" )

java.time

您正在使用麻烦的旧日期时间类(现在已遗留),由java.time类取代。

解析度

  • 毫秒
    旧的日期时间类仅限于毫秒级分辨率,最多三位数的小数部分。
  • 微秒
    您的输入具有六位小数秒的位数,单位为微秒。
  • 纳秒
    java.time类的纳秒分辨率最多为小数秒的九位数。 超过您的微秒就足够了。

ISO 8601

ISO 8601标准定义了表示日期时间值的字符串格式。 您输入的符合ISO 8601。

解析和生成字符串时,java.time类默认使用ISO 8601格式。 因此,无需指定格式化模式。

Instant instant =
    Instant.parse( "2014-03-17T20:05:49.2300963Z" );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM