2012-02-11 24 views
35

私はJavaで次のような問題が生じています(私は何人かの人々はJavaScriptで同様の問題 を持っているが、私は、Javaを使用している参照)java.util.DateとgetYearメソッド()

System.out.println(new Date().getYear()); 
System.out.println(new GregorianCalendar().getTime().getYear()); 
System.out.println(this.sale.getSaleDate().getYear()); 
System.out.println(this.sale.getSaleDate().getMonth()); 
System.out.println(this.sale.getSaleDate().getDate()); 

戻り

I/System.out(4274): 112 
I/System.out(4274): 112 
I/System.out(4274): 112 
I/System.out(4274): 1 
I/System.out(4274): 11 

私は2012年になると考えていた112ビットを理解していません。 何が起こっているのですか? java.util.Dateクラスは使用できませんか?私はこのフィールドを日付と時刻を格納する私のクラスのいくつかの に格納しています。私は何をすべきか? Javadocには、

答えて

39

@Deprecated 
public int getYear() 

を推奨されていません。 JDKバージョン1.1以降は、Calendar.get(Calendar.YEAR) - 1900に置き換えられました。

このDateオブジェクトによって表される瞬間を含む、または開始する時刻から、ローカルタイムゾーンで解釈された1900を引いた値を返します。

戻り値: この日付で表される年、マイナス1900

参照: Calendar

だから、112が正しい出力です。私はJavadocのアドバイスに従うか、代わりにJodaTimeを使用します。

+4

+1 for JodaTime – dnault

+4

完全にbizaare仕様の正しい実装! –

+0

これはY2Kバグですか? – jumpnett

9

うん、これは実際に起こっていることです。またJavadoc参照:

Returns: 
    the year represented by this date, minus 1900. 

getYearメソッドメソッドは、このような理由のために推奨されていません。だから、それを使わないでください。

getMonthは0から11までの数値を返します。したがって、this.sale.getSaleDate().getMonth()は、2ではなく2月に1を返します。java.util.Calendarは、すべての年に1900を加算しませんが、月の問題。

JodaTimeを使用する方がずっと良いです。

1

この動作はjava.util.Date級のマニュアルに記載されています

が含まれているか、この Dateオブジェクトが表す時に一瞬で始まる年 から1900を引いた結果である値を返します。 、現地時間帯で解釈されます。

また、非推奨としてマークされています。代わりにjava.util.Calendarを使用してください。Dateを使用しないでください

19

は、Calendarを使用します。それは、同様の時間をサポートしてい

// Beware: months are zero-based and no out of range errors are reported 
Calendar date = new GregorianCalendar(2012, 9, 5); 
int year = date.get(Calendar.YEAR); // 2012 
int month = date.get(Calendar.MONTH); // 9 - October!!! 
int day = date.get(Calendar.DAY_OF_MONTH); // 5 

Calendar dateTime = new GregorianCalendar(2012, 3, 4, 15, 16, 17); 
int hour = dateTime.get(Calendar.HOUR_OF_DAY); // 15 
int minute = dateTime.get(Calendar.MINUTE); // 16 
int second = dateTime.get(Calendar.SECOND); // 17 
30

使用日付形式

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
Date date = format.parse(datetime); 
SimpleDateFormat df = new SimpleDateFormat("yyyy"); 
year = df.format(date); 
すべてのコメントに加えて
32

、私は、java.util.Date、java.util.Calendar、およびjを使用する方法に関するいくつかのコードを追加するかもしれないと思ったava.util.GregorianCalendarをjavadocに従ってください。日付の多く

//Initialize your Date however you like it. 
Date date = new Date(); 
Calendar calendar = new GregorianCalendar(); 
calendar.setTime(date); 
int year = calendar.get(Calendar.YEAR); 
//Add one to month {0 - 11} 
int month = calendar.get(Calendar.MONTH) + 1; 
int day = calendar.get(Calendar.DAY_OF_MONTH); 
0
 try{ 
int year = Integer.parseInt(new Date().toString().split("-")[0]); 
} 
catch(NumberFormatException e){ 
} 

推奨されていません。

+0

例外で何かをすることをお勧めします。 (例えば、コードの場合は、「ここで何かする」というコメントだけです)。例外を「食べる」ことは悪い習慣であり、デバッグが難しくなります。 –

2

TL; DR

LocalDate.now()  // Capture the date-only value current in the JVM’s current default time zone. 
     .getYear() // Extract the year number from that date. 

java.time両方java.util.Datejava.util.Calendarクラス

は今java.timeフレームワークに取って代わらレガシー、ジャワに組み込まれています8以降。

タイムゾーンは、日付を決定する際に重要です。任意の瞬間について、日付は地球の周りでゾーンごとに異なります。たとえば、Paris Franceの真夜中の数分後には、新しい日がありますが、まだ「昨日」はMontréal Québecです。

タイムゾーンが指定されていない場合、JVMは現在のデフォルトタイムゾーンを暗黙的に適用します。そのデフォルトはいつでも変更される可能性がありますので、結果は異なる場合があります。期待どおりのタイムゾーンを明示的に引数として指定する方がよいでしょう。

は、America/MontrealAfrica/Casablanca、又はPacific/Aucklandとして、continent/regionの形式でproper time zone nameを指定します。 ESTまたはISTのような3〜4文字の略語は、ではなく、のように、標準化されておらず、ユニークではない(!)と使用しないでください。

ZoneId z = ZoneId.of("Africa/Tunis") ; 

あなたは時間帯、使用LocalDateせずに日付のみをしたい場合。このクラスにはタイムゾーン情報がありませんが、現在の日付を決定するタイムゾーンを指定できます。

ZoneId zoneId = ZoneId.of("America/Montreal"); 
LocalDate localDate = LocalDate.now(zoneId); 

あなたはgetYeargetMonth、そしてgetDayOfMonthで各種情報を取得することができます。あなたは実際にjava.timeを使って年番号を取得します!

int year = localDate.getYear(); 

あなたは、日時の代わりに、日付だけをしたい場合は、ZonedDateTimeクラスを使用します。

ZonedDateTime zdt = ZonedDateTime.now(zoneId) ; 

java.timeについて

java.timeフレームワークは、Java 8に組み込まれており、後にされています。これらのクラスは、java.util.Date.Calendar、& java.text.SimpleDateFormatなどの面倒な古い日時クラスに取って代わります。

にあるJoda-Timeプロジェクトは、java.timeクラスへの移行を推奨しています。

Oracle Tutorialを参照して、詳細をご覧ください。そして、多くの例と説明のためにStack Overflowを検索してください。 java.time機能の多く

ThreeTen-BackportのJava 6 &のJava 7に戻って、移植し、さらに(How to use…参照)ThreeTenABPAndroidに適合されます。

ThreeTen-Extraプロジェクトは、追加のクラスでjava.timeを拡張します。このプロジェクトは、将来のjava.timeへの追加の可能性を証明する土台です。ここでは、IntervalYearWeekYearQuartermoreなどの便利なクラスがあります。

5

のJava 8 LOCALDATEクラスは

int year = LocalDate.parse(new SimpleDateFormat("yyyy-MM-dd").format(date)).getYear(); 

別のオプションがあり、

int year = Integer.parseInt(new SimpleDateFormat("yyyy").format(date)); 
+0

厄介なレガシークラス 'SimpleDateFormat'と現代の* java.time *クラスを混在させるのはなぜですか? 「SimpleDateFormat」を完全に置き換える['DateTimeFormatter'](https://docs.oracle.com/javase/9​​/docs/api/java/time/format/DateTimeFormatter.html)を使用してください。 –

0

Javaドキュメントは、カレンダーを利用することを提案し、java.util.Dateから年を取得するための別のオプションですこの代わりにこの廃止された方法の代わりにクラス カレンダーオブジェクトを設定するサンプルコードは次のとおりです

Calendar calendar = Calendar.getInstance(); 
calendar.setTime(new Date()); 
ここ

は、年、月を取得するためのサンプルコード、などである

System.out.println(calendar.get(Calendar.YEAR)); 
System.out.println(calendar.get(Calendar.MONTH)); 

カレンダーもここdocumentationなど他の多くの有用な情報のように、TIME、DAY_OF_MONTH、のサポートは注意してくださいそれら の全てを列挙していますその月は0ベースです。 1月は0番目の月です。

+1

FYI、[java.util.Date'](https://docs.oracle.com/javase/9​​/docs/api/java/util/Date.html)などの面倒な古い日時クラス、 'java.util.Calendar'](https://docs.oracle.com/javase/9​​/docs/api/java/util/Calendar.html)、' java.text.SimpleDateFormat'は現在[レガシー]です( [java.time](https://docs.oracle.com/javase/9​​/docs/api/java/time/package-summary)に取って代わられています(https://en.wikipedia.org/wiki/Legacy_system)。 html)クラスをJava 8およびJava 9に組み込みました。[* Tutorial * by Oracle](https://docs.oracle.com/javase/tutorial/datetime/TOC.html)を参照してください。 –

1

Year.now()

のJava 8+でjava.timeライブラリを使用する簡単な方法があります。

java.time.Year.now().getValue() 

は、現在の年をデフォルトのタイムゾーンを使用して4桁の整数として返します。さまざまな時間のオプションがたくさんあります。ZoneId s、Calendars、Clocksですが、これはほとんどの時間に欲しいと思います。コードをより綺麗に見せたい場合は(他のjava.time。*は必要ありません。ファイルの先頭に

import static java.time.Year.now; 

、およびコール:今()関数)、入れ

now().getValue() 

を必要に応じて。

関連する問題