2017-04-11 64 views
-3

有时日期对象给我一周的错误日子。我的代码非常简单。在Java中,为什么Date()对象的printf有时会出错?

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

这给了我'星期三',这是正确的。事实上,它似乎在最近和未来的任何一年都可以正常工作。

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

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

它实际上是8月5日2999是星期一时返回'星期二'。

这是怎么发生的?我该如何解决它?

干杯!

+1

不建议使用年份,月份和日期的构造函数,并且不应使用它。 – 1615903

+11

您不打印2017年或2999年的日期。您打印的日期为3917和4899.还有一个避免使用java.util.Date的原因。你也试图打印出8月4日而不是8月5日。 (而不是7月11日,而不是7月12日。)我建议你删除这个问题,因为它基本上结束为“我没有阅读我调用的构造函数的文档。” –

+5

请注意,通过首先调用'System.out.println(dt);'来检查日期是否正确,就可以看到这两个错误。在指责平台之前,始终认为*你的*代码可能是错误的 - 如果你要声明平台是错误的,那么你应该尽一切可能首先检查平台。 –

回答

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 

真巧,这恰好是一个星期三,你的预期。我怀疑这个巧合通过2099年举行2001年的IT不会在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多的文档。

相关问题