在Java中,为什么Date()对象的printf有时会出错?

时间:2017-04-11 05:55:00

标签: java date datetime printf

有时日期对象会给我错误的一周。我的代码非常简单。

//Setting to 2017, April, 12th
Date dt = new Date(2017, 3, 11);
System.out.printf("%TA", dt);

这给了我'WEDNESDAY',这是正确的。事实上,在近期和不久的将来,它似乎在任何一年都能正常运作。

但是,如果我将时间设置为2999,8月,5日。这是

//Setting to 2999, August, 5th
Date dt = new Date(2999, 7, 4);
System.out.printf("%TA", dt);

当实际8月2999日是星期一时,它会返回'星期二'。

为什么会这样?我该如何解决这个问题?

干杯!

1 个答案:

答案 0 :(得分:2)

  

为什么会这样?

您的答案的重要部分已在评论中。这种贬低的构造函数令人困惑。你设法让这个月变得正确,很多人都没有;你错了一年,而且每个月错了。由于您使用的是System.out.printf(),因此您也可以使用它进行检查:

    // Setting to 2017, April, 12th -- NOT
    Date dt = new Date(2017, 3, 11);
    System.out.printf("%1$tm %1$te,%1$tY%n", dt);

打印

04 11,3917

这恰好是你所预期的星期三。我怀疑这种巧合可以持续到2001年到2099年。它在2000年2月没有。当年2月12日是星期六,但是:

    // Incorrect attempt at setting to 2000, February, 12th
    dt = new Date(2000, 1, 11);
    System.out.printf("%TA%n", dt);

打印

SUNDAY
  

我该如何解决这个问题?

如果您可以使用Java 8或更高版本,我建议您不要仅使用已弃用的构造函数,而应远离Date类altoghether。这些天我们有一堆更好的选择。

    // Setting to 2999, August, 5th
    LocalDate ld = LocalDate.of(2999, Month.AUGUST, 5);
    System.out.println(ld);
    System.out.printf("%TA", ld);

打印正确的

2999-08-05
MONDAY

我通常会在新课程中使用DateTimeFormatter,但LocalDate也会与System.out.printf()一起使用。根据文档,它适用于TemporalAccessor,其中包括DayOfWeekInstantIsoEraLocalDateLocalDateTimeLocalTimeMonthMonthDayOffsetDateTimeOffsetTimeYearYearMonthZonedDateTimeZoneOffset