【问题标题】:Joda periods isn't printing dayJoda period 不是印刷日
【发布时间】:2014-01-31 23:30:40
【问题描述】:

在解析时间瞬间时,我在 JodaTime 中发现了某种不当行为。

 DateTimeFormatter dateStringFormat =
                DateTimeFormat.forPattern("EEE MMM dd kk:mm:ss 'GMT'Z yyyy");
        DateTime startTime = dateStringFormat.withOffsetParsed().
                parseDateTime("Tue Jan 01 09:30:00 GMT+2000 2013");
        DateTime endTime = dateStringFormat.withOffsetParsed().
                parseDateTime("Tue Jan 05 10:31:00 GMT+2000 2013");


        Period period = new Period(startTime, endTime);

        PeriodFormatter formatter = new PeriodFormatterBuilder().appendDays()
                .appendSuffix(" day ", " days")
                .appendHours()
                .appendSuffix(" hour ", " hours")
                .appendMinutes()
                .appendSuffix(" minute", " minutes")
                .toFormatter();


        System.out.println(formatter.print(period));

输出为:“1 小时 1 分钟”
“天”部分在哪里?


Basil Bourque 的代码版本……

在第二个 DateTime 中,月份日期莫名其妙地被解析为 01 而不是 05。

DateTimeFormatter dateStringFormat = DateTimeFormat.forPattern("EEE MMM dd kk:mm:ss 'GMT'Z yyyy");
DateTime startTime = dateStringFormat.withOffsetParsed().parseDateTime("Tue Jan 01 09:30:00 GMT+2000 2013");
DateTime endTime = dateStringFormat.withOffsetParsed().parseDateTime("Tue Jan 05 10:31:00 GMT+2000 2013");

转储到控制台...

System.out.println( "startTime: " + startTime );
System.out.println( "endTime: " + endTime );

运行时……

startTime: 2013-01-01T09:30:00.000+20:00
endTime: 2013-01-01T10:31:00.000+20:00

【问题讨论】:

  • 我已经确认了这个问题。但是您可以从示例代码的后半部分中删除所有句点和“格式化程序”代码。问题出在解析中,两个 DateTime 实例中的日期都是 01,但第二个 DateTime 应该是 05。我会将更简单的代码粘贴到您的问题中。您可以根据需要删除或编辑。
  • 我可以确认by LaurentGby PopoFibo 的两个答案都是正确的。在第二个 DateTime 中将 Tue 更改为 Sat 可以解决问题。日期格式很讨厌!尽可能坚持使用ISO 8601 标准格式:2013-01-05T10:31:00+20:00

标签: java datetime jodatime


【解决方案1】:

发生这种情况是因为在这种情况下 endTime 表示的日期不正确 - 这意味着 Jan 05 2013 不是 星期二,但实际上是 星期六。 p>

这行得通:

DateTimeFormatter dateStringFormat = DateTimeFormat.forPattern("EEE MMM dd kk:mm:ss 'GMT'Z yyyy");
DateTime startTime = dateStringFormat.withOffsetParsed().parseDateTime("Tue Jan 01 09:30:00 GMT+2000 2013");
DateTime endTime = dateStringFormat.withOffsetParsed().parseDateTime("Sat Jan 05 10:31:00 GMT+2000 2013");

System.out.println(dateStringFormat.print(startTime));
System.out.println(dateStringFormat.print(endTime));

输出:

Tue Jan 01 09:30:00 GMT+2000 2013 
Sat Jan 05 10:31:00 GMT+2000 2013

看起来 Joda 时间正在使用这一天进行解析。将Tuesday 切换为Saturday 会将日期翻转为Jan 05无论格式模式中的顺序如何

DateTimeFormatter dateStringFormat = DateTimeFormat.forPattern("MMM dd EEE kk:mm:ss 'GMT'Z yyyy");
DateTime endTime = dateStringFormat.withOffsetParsed().parseDateTime("Jan 01 Sat 10:31:00 GMT+2000 2013");
DateTime startTime = dateStringFormat.withOffsetParsed().parseDateTime("Jan 01 Tue 09:30:00 GMT+2000 2013");

输出:

Jan 01 Tue 09:30:00 GMT+2000 2013
Jan 05 Sat 10:31:00 GMT+2000 2013

【讨论】:

    【解决方案2】:

    两个日期都是星期二。如果您更正此问题并将 2013 年 1 月 5 日设置为星期六(原样),那么它可以工作:

    DateTime startTime = dateStringFormat.withOffsetParsed().parseDateTime("Tue Jan 01 09:30:00 GMT+2000 2013");
    DateTime endTime = dateStringFormat.withOffsetParsed().parseDateTime("Sat Jan 05 10:31:00 GMT+2000 2013");
    

    看起来没有办法用 Joda Time 检查日期是否有效:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-06
      • 1970-01-01
      • 1970-01-01
      • 2015-08-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多