【问题标题】:String to date (Invalid format)迄今为止的字符串(格式无效)
【发布时间】:2010-06-10 07:30:35
【问题描述】:

我正在使用Joda-Time 库将我的字符串日期转换为真实日期,因为这似乎是最简单的解决方案。我正在使用DateTime 对象来执行此操作;

 new DateTime(strValue);

但是当插入某些格式时,它会抛出异常;

java.lang.IllegalArgumentException: Invalid format: "Mon, 30 Sep 2002 01:56:02 GMT"
java.lang.IllegalArgumentException: Invalid format: "Sun, 29 Sep 2002 19:59:01 GMT"
java.lang.IllegalArgumentException: Invalid format: "Mon, 30 Sep 2002 01:52:02 GMT"
java.lang.IllegalArgumentException: Invalid format: "Sun, 29 Sep 2002 17:05:20 GMT"
java.lang.IllegalArgumentException: Invalid format: "Sun, 29 Sep 2002 19:09:28 GMT"
java.lang.IllegalArgumentException: Invalid format: "Sun, 29 Sep 2002 15:01:02 GMT"
java.lang.IllegalArgumentException: Invalid format: "Sun, 29 Sep 2002 23:48:33 GMT"
java.lang.IllegalArgumentException: Invalid format: "Sun, 29 Sep 2002 17:24:20 GMT"
java.lang.IllegalArgumentException: Invalid format: "Sun, 29 Sep 2002 11:13:10 GMT"

有没有办法解决这个问题,或者我应该使用其他东西来代替 DateTime。

【问题讨论】:

标签: java date calendar jodatime


【解决方案1】:

该构造函数不是某种通用的日期时间字符串解释引擎。它需要定义为YYYY-MM-DDTHH:MM:SS.SSSZ 的常规 ISO 日期的变体。

您将需要定义一个格式字符串来描述您的格式,然后可以从中进行解析。类似于EEE, dd MMM YYYY HH:mm:ss zzz javadoc here!

【讨论】:

  • @Affe:EEE, dd MMM YYYY HH:mm:ss zzz 中的YYYY 部分不应该是小写字母(yyyy)吗?
【解决方案2】:

如果我没记错的话,您在此处使用的默认解析器需要ISO 8601 格式的时间,而事实并非如此。否则你需要自己创建DateTimeFormatter

【讨论】:

    【解决方案3】:

    tl;博士

    ZonedDateTime.parse(
        "Mon, 30 Sep 2002 01:56:02 GMT" ,
        DateTimeFormatter.RFC_1123_DATE_TIME
    )
    

    2002-09-30T01:56:02Z

    RFC 1123

    Mon, 30 Sep 2002 01:56:02 GMT 等字符串的格式在过时的标准 RFC 1123RFC 822 中定义。

    顺便说一句,这是一种糟糕的格式。将日期时间值序列化为文本时,请改用ISO 8601 标准格式。现在您会发现采用 ISO 8601 格式的更新标准和协议。

    java.time

    Joda-Time 项目现在位于maintenance mode,团队建议迁移到java.time 类。见Tutorial by Oracle

    java.time 类 DateTimeFormatter 有一个内置格式化程序用于这种古老的格式:DateTimeFormatter.RFC_1123_DATE_TIME

    String input = "Mon, 30 Sep 2002 01:56:02 GMT";
    DateTimeFormatter f = DateTimeFormatter.RFC_1123_DATE_TIME;
    

    使用该格式化程序来实例化 ZonedDateTime 对象。

    ZonedDateTime zdt = ZonedDateTime.parse( input , f );
    

    转储到控制台。

    String output = zdt.toString() ;  // Generate a string in standard ISO 8601 format.
    System.out.println( "zdt.toString(): " + output );
    

    看到这个code run live at IdeOne.com

    zdt.toString(): 2002-09-30T01:56:02Z


    关于java.time

    java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

    Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

    要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

    从哪里获取 java.time 类?

    ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多