【问题标题】:DateTimeFormatter not working all the time, bug?DateTimeFormatter 不能一直工作,错误?
【发布时间】:2016-01-05 13:06:19
【问题描述】:

我在运行一些代码时遇到了一个奇怪的错误。这是一个简单的版本来展示相同的内容。

public class DateTest {

    public static void main(String[] args) {

        LocalDate decLast = LocalDate.of(2015, 12, 31);
        LocalDate novLast = LocalDate.of(2015, 11, 30);
        LocalDate octLast = LocalDate.of(2015, 10, 31);

        System.out.println(decLast+" "+novLast+" "+octLast);

        System.out.println(decLast.format(DateTimeFormatter.ofPattern("dd M YY"))+" "
                +novLast.format(DateTimeFormatter.ofPattern("dd M YY"))+" "
                +octLast.format(DateTimeFormatter.ofPattern("dd M YY")));


    }
}

这返回了以下结果

2015-12-31 2015-11-30 2015-10-31
31/12/16 30/11/15 31/10/15

不知何故,2015 年 12 月 31 日转换为 2016 年 12 月 31 日。 我写了一个 for 循环来为不同的年份做同样的事情,发现很多年都有变化。对于 12 月 26 日以下的任何日期,该错误都不存在。这是一个错误还是我在这里遗漏了什么?

【问题讨论】:

    标签: java datetime java-8 java-time


    【解决方案1】:

    大写的Y 是“week based year”,您正在寻找小写的y

    来自链接的维基百科文章(我强调):

    一个 ISO 周编号年份(也称为 ISO 年)有 52 或 53 个完整周。那是 364 或 371 天,而不是通常的 365 或 366 天。额外的一周在这里被称为闰周,尽管 ISO 8601 没有使用这个术语。周从星期一开始。一年的第一周是包含一年中第一个星期四的那一周(因此,总是包含 1 月 4 日)。 因此,ISO 周年编号在接近 1 月 1 日的某些日子与公历略有不同

    [...]

    例如,2014 年 12 月 29 日是 ISO 2015-W1-1,即它是 2015 年而不是 2014 年。

    参照。还有:https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html

    【讨论】:

    猜你喜欢
    • 2014-11-22
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多