Java Unparseable日期

时间:2014-03-17 20:25:06

标签: java parsing date simpledateformat

我有一个格式为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例句中的结果。

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

修改 重新阅读文档,我已经开始了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中不可能只有一小部分时间。它必须被截断为毫秒。我最终使用了我的数据库提供给我的类型,但一般的解决方案是将秒的小数部分截断为毫秒。我将发布如何做到这一点的示例代码作为答案。

4 个答案:

答案 0 :(得分:4)

您需要提供与日期S中一样多的String。在这种情况下,7

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

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


另请注意,

2300963

作为毫秒值意味着2300秒和963毫秒。你为什么这么做?为什么那些秒数不是它们相应位置的值的一部分?当DateFormat解析它时,它们将被添加。

答案 1 :(得分:1)

这有效: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
  3. 编辑Relevant to your partial seconds issue

答案 2 :(得分:0)

如何将小数秒截断为毫秒(因为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;
}

答案 3 :(得分:0)

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" );
相关问题