2017-04-11 7 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日に時間を設定します。これは実際には2999年8月5日は月曜日であるとき、それは「火曜日」返し

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

です。

どうしてですか?そして私はどうすれば周りを回ることができますか?

乾杯!

+1

年、月、および日を使用するコンストラクタは廃止予定です。使用しないでください。 – 1615903

+11

あなたは、2017年に日付をプリントアウトしていないか、2999であなたは 'java.util.Date'を使用して回避するためにさらに別の理由3917と4899.で日付を印刷しています。また、8月5日ではなく8月4日を印刷しようとしています。 (7月12日ではなく7月11日)、この質問を削除することをお勧めします。「私が呼び出すコンストラクタのドキュメントを読まなかったからです。最初の ';日付がちょうど'のSystem.out.println(DT)を呼び出すことによって最初に正しかったことを確認することで、これらのエラーの両方を見ているだろう –

+5

注意。プラットホームを非難する前に*あなたの*コードが間違っていると常に仮定してください - プラットフォームが間違っていると主張するなら、まずそれを確認するためにできるすべてのことをしておかなければなりません。あなたが使っているコンストラクタは、前千年紀以降廃止されていることは言うまでもありません –

答えて

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 

すごい偶然ことを出力します。私はそれが今年は土曜日だったことを2000年2月2月12日に成立していない年2099年を通じて2001年の保持するために、この偶然の一致を疑うだろうが、:

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

これは

SUNDAY 

を印刷しますそして私はどうすれば周りを回ることができますか?

Java 8以降を使用できる場合は、廃止予定のコンストラクタだけでなく、Dateクラスから離れることをおすすめします。最近は、より良い選択肢がたくさんあります。

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

これは、私は通常、新しいクラスでDateTimeFormatterを使用しますが、ちょうど示すように、あまりにもSystem.out.printf()LocalDate働く正しい

2999-08-05 
MONDAY 

を印刷します。ドキュメントによれば、DayOfWeekInstantIsoEraLocalDateLocalDateTimeLocalTimeMonthMonthDayOffsetDateTimeOffsetTimeYearYearMonthZonedDateTimeZoneOffsetなどを含む、TemporalAccessorで動作します。

関連する問題