2017-12-28 12 views
1

下のテストケースでは、後で私はDateUtil.format(calendarObj,"yyyy-MM-dd")を使って書式設定しています。 しかし、私は結果を印刷するとき、それは、例えば、1Groovy:DateUtil.format "yyyy-MM-dd"は、書式設定中に月ごとに1つずつインクリメントします。

で月をインクリメント:

のGroovyコード:

def testDate=new GregorianCalendar(2000,1,30); 
def testDate1=new GregorianCalendar(2000,1,5); 
def testDate2=new GregorianCalendar(2000,4,25); 
def testDate3=new GregorianCalendar(2000,6,10); 

出力(System.out.println(DateUtil.format(testDate/1/2/3,"yyyy-MM-dd"))を使用して):

2000-03-01 
2000-02-05 
2000-05-25 
2000-07-10 

缶誰がなぜこれが起こっているのか説明してください。

+0

奇妙なことに、最初の例では '2月30日(それは存在しません)を作成していて、あなたは' 3月1日になっています。 –

+1

@Hector:それほど興味がありません。 2000年は閏年でしたが、2月は29日でした。したがって、値を30年2月に設定すると、カレンダーは月と日を1に自動的に変更します。同じように、32月に設定すると、実際には1月2日となります。 –

+1

それは私にとって本当に悪いデザインです。どう思いますか? –

答えて

5

Javaでヶ月(および拡張グルービーによって)ゼロベースで、1月0あるコメントで述べたように、2月等

1であるので、これは/だけ元のJava日付の場合であります(java.util.Date,java.util.Calendar、...)。

Java 8(java.time.LocalDate、...)で導入された新しい(好ましい)日付/時刻APIのクラスでは、この動作がより直観的に変更されました。

+2

あなたがそこにいるニースの帽子 –

+3

「Java」ではありません。 GregorianCalendarで。この古い醜いGregorianCalendarよりも優先されるはずのjavax.time APIは、1から始まる月を使用します。 –

+1

@JBNizet私の答えを更新します。 –

関連する問題