2017-04-11 84 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多的文檔。

相關問題