Javaで現在の年の整数値を取得します


300

Javaで現在の年を整数として決定する必要があります。だけを使用することもできますがjava.util.Date()、非推奨です。


3
いいえ、Java 8 以降java.util.Date非推奨ではありません。そのメソッドの一部は非推奨ですが、クラス全体ではありません。しかし、両方java.util.Dateを避けてくださいjava.util.Calendar。悪名高いほど厄介で、混乱し、欠陥があるためです。代わりに、java.time(Java 8の場合)またはJoda -Timeを使用してください
バジルボーク

回答:


636
int year = Calendar.getInstance().get(Calendar.YEAR);

これが新しいカレンダーを設定しないという基準を満たしているかどうかわかりませんか?(なぜそうすることに反対するのですか?)


1
あなたの答えを見て、カレンダーは使うのに素晴らしいオブジェクトでしょう。ワンライナーを探していましたが、Calendarでそれができるとは思いませんでした。私は間違っていることが証明されています!ありがとう!
karlgrz 2008

並行性についてはどうですか、他のスレッド/ライブラリコードの一部が現在の時間を変更する場合はどうでしょうか それを次のように変更するのは合理的ではないでしょうか。Calendar c = Calendar.getInstance(); 同期(c){c.setTimeInMillis(System.currentTimeMillis()); return c.get(Calendar.YEAR);}
jnr

1
これは、Androidのバージョンによって異なる値を返します。Android v4.1.2とv4.2.1を比較しています。
toobsco42 2013年

2
@ycnixコードに同時実行性の問題はないため、よりコンパイルする必要はありません。Calendar.getInstance().get(Calendar.YEAR) 外部で変更されるクロックに関してはアトミックでsynchronized(c)あり、ローカル変数の新規インスタンスで実行しても、ここでは非常に無意味です。
nos

5
import java.util.Calendar
Dominykas Mostauskis

139

Java 8の時刻APIを使用して(システムのデフォルトのタイムゾーンで年を取得してもよいと仮定した場合)、次Year::nowメソッドを使用できます。

int year = Year.now().getValue();

7
JVMの現在のデフォルトゾーンに暗黙的に依存ZoneIdするのnowではなく、常にオプションの引数を渡すことをお勧めします(実行時にいつでも変更可能です!)。
バジルブルク

これは、このBTWに似ています:int year = Year.now(ZoneId.of("America/New_York")).getValue(); docs.oracle.com/javase/8/docs/api/java/time/Year.html#now--
bcmoney

25

この最も簡単な(カレンダーを使用して、申し訳ありません)は次のとおりです。

 int year = Calendar.getInstance().get(Calendar.YEAR);

新しいDate and Time API JSRJoda Timeもあります。


これは、Androidのバージョンによって異なる値を返します。Android v4.1.2とv4.2.1を比較しています。
toobsco42 2013年

1
@ toobsco42-'android calendar.year bug'のグーグルを試す
ツールキット

@toolkitさん、私は運が悪いのでいくつかの研究を行っています。もっと具体的な答えを期待していた。
toobsco42 2013年

4.1.2でSIMカードを電話から取り外しました。そのため、ネットワークは電話の日付と時刻を更新できませんでした。その結果、電話は2012年に行き詰まりました。これは4.1.2のバグではないようです。
toobsco42 2013年

14

最も簡単な方法は、カレンダーから年を取得することです。

// year is stored as a static member
int year = Calendar.getInstance().get(Calendar.YEAR);

Calendar.YEARは現在の年ではありません。
ツールキット

Calendar.YEARはこのように定義されています... public final static int YEAR = 1;
cagcowboy 2008

2
Calendarのget()APIは、定数で指定されたフィールドにあるデータを取得します。年はCalendarオブジェクトの1のフィールドにあります!Calendar.getInstance()が現在の日付を取得しています。 java.sun.com/j2se/1.4.2/docs/api/java/util/…–
Bob King

これは、Androidのバージョンによって異なる値を返します。Android v4.1.2とv4.2.1を比較しています。
toobsco42 2013年

4.1.2でSIMカードを電話から取り外しました。そのため、ネットワークは電話の日付と時刻を更新できませんでした。その結果、電話は2012年に行き詰まりました。これは4.1.2のバグではないようです。
toobsco42 2013年

13

java.time.YearMonth(Java 8以降)の2つのメソッドを使用することもできます。

import java.time.YearMonth;
...
int year = YearMonth.now().getYear();
int month = YearMonth.now().getMonthValue();

ずっと前に投稿された別の回答を誤って複製しました。そして、あなたは質問に関係のない月を作り出します。そして、あなたはタイムゾーンの重要な問題を無視します。そして、あなたのフォーマットは乱雑です。Stack Overflowにご参加いただき、誠にありがとうございます。しかし、この答えは十分ではありません。編集してその弱点を修正し、他の回答ですでに提供されているものよりも多くの価値を追加します。または、反対票を集める前に回答を削除してください。PSスーパーアバターアイコン!
バジルブルク

どうもありがとう。編集しました。リンクは少し異なっている私の方法
Zhurovコンスタンチン

10

日付オブジェクトの年が必要な場合は、次の方法を使用しました。

public static int getYearFromDate(Date date) {
    int result = -1;
    if (date != null) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        result = cal.get(Calendar.YEAR);
    }
    return result;
}

結果は1970です!
aNdRO博士18年

10

tl; dr

ZonedDateTime.now(  ZoneId.of( "Africa/Casablanca" )  )
             .getYear()

タイムゾーン

その答えによってラフィKhatchadourianは賢明に新しい使用方法を示してjava.timeパッケージを解答するJava 8でそれが日付を決定する際に、タイムゾーンの重要な問題に対処するために失敗しました。

int年= LocalDate.now()。getYear();

そのコードは、JVMの現在のデフォルトのタイムゾーンに依存します。デフォルトゾーンは、今日の日付を決定するために使用されます。たとえば、パリの深夜0時を過ぎても、モントリオールの日付はまだ「昨日」であることを覚えておいてください。

したがって、結果は、それが実行されるマシン、ホストOSのタイムゾーンを変更するユーザー/管理者、またはJVMの現在のデフォルトを変更する任意の時点での Javaコードによって異なる場合があります。タイムゾーンを指定することをお勧めします。

ちなみに、常にIANAで定義されている適切なタイムゾーン名を使用してください。標準化されておらず、一意でもない3〜4文字のコードを使用しないでください。

java.time

Java 8のjava.timeの例。

int year = ZonedDateTime.now(  ZoneId.of( "Africa/Casablanca" )  ).getYear() ;

ジョーダタイム

上記のようなアイデアですが、Joda-Time 2.7ライブラリを使用しています。

int year = DateTime.now( DateTimeZone.forID( "Africa/Casablanca" ) ).getYear() ;

年の増加/減少

一度に1年ずつジャンプすることが目的の場合は、年数を抽出する必要はありません。Joda-Timeとjava.timeの両方に、一度に1年ずつ加算/減算するメソッドがあります。そして、これらの方法はスマートで、夏時間やその他の異常を処理します。

Joda-Time 2.7の例。

DateTime oneYearAgo = DateTime.now( DateTimeZone.forID( "Africa/Casablanca" ) ).minusYears( 1 ) ;

2
レイジーIDのすべてのゾーンID(私として):mkyong.com/java8/java-display-all-zoneid-and-its-utc-offset
FBB

1
@FBB タイムゾーン名のIANA公式リストについては、ウィキペディアのページをお勧めします。注意:これらのゾーンは驚くほど頻繁に変化します。本当に最新の情報が必要な場合はtzdataデータファイルの新しいコピーを自分でダウンロードしてください。ファイルを閲覧できます。また、Java実装で古いtzdataを置き換えることができます。Oracleは、JVM用の更新ツールを提供しています。
バジルブルク

4

アプリケーションでDateオブジェクトとCalendarオブジェクトを頻繁に使用している場合、java.util.Dateは変更可能であるため、実際にはJoda Timeを使用してください。java.util.Calendarフィールドが更新されるとパフォーマンスの問題が発生し、日時の計算が不格好です。



3

一部の人々が上記で答えたように:

後で変数を使用する場合は、より適切に使用します。

int year;

year = Calendar.getInstance().get(Calendar.YEAR);

ちょうど良い条件で年が必要な場合は、より適切に使用します。

Calendar.getInstance().get(Calendar.YEAR)

たとえば、導入された年のチェックが現在の年-200以上、または現在の年(誕生年である可能性があります)よりも多いチェックを行うdo do whileで使用する場合:

import java.util.Calendar;
import java.util.Scanner;

public static void main (String[] args){

    Scanner scannernumber = new Scanner(System.in);
    int year;

    /*Checks that the year is not higher than the current year, and not less than the current year - 200 years.*/

    do{
        System.out.print("Year (Between "+((Calendar.getInstance().get(Calendar.YEAR))-200)+" and "+Calendar.getInstance().get(Calendar.YEAR)+") : ");
        year = scannernumber.nextInt();
    }while(year < ((Calendar.getInstance().get(Calendar.YEAR))-200) || year > Calendar.getInstance().get(Calendar.YEAR));
}

3

Java 8には次のコードを使用します。

LocalDate localDate = LocalDate.now();
int year = localDate.getYear();
int month = localDate.getMonthValue();
int date = localDate.getDayOfMonth();

0

私の場合、上記のどれも機能しません。だから多くの解決策を試した後、私は1つ以下を見つけ、それは私のために働いた

import java.util.Scanner;
import java.util.Date;

public class Practice
{   
    public static void main(String[] args)
    {
        Date d=new Date();  
        int year=d.getYear();
        int currentYear=year+1900;    

        System.out.println(currentYear);

    }

}

そのメソッドは非推奨です。そして、その恐ろしいクラスは、JSR 310で定義されたjava.timeクラスに取って代わられました。Answer by assyliasの最新のソリューションを参照してください。
バジルブルク

ええ、でも私は積極的に解決策を探していて、利用可能な多くの解決策を試しました、そして私にとってこれはうまくいったので私は投稿しました:)
Mayur Satav

-1

Javaバージョン8以降では、java.timeライブラリを使用できます(推奨)。ISO 8601は日付を書き込むための標準的な方法を設定し、それYYYY-MM-DDjava.time.Instant使用するので(の場合UTC):

import java.time.Instant;
int myYear = Integer.parseInt(Instant.now().toString().substring(0,4));

PSは念のため(そしてを取得するためStringではなくint)、使用するとCalendar見栄えが良くなり、ゾーン対応にすることができます。


あなたはタイムゾーンの重要な問題を無視しています。他の回答でより簡単な解決策を参照してください。
バジルブルク

-2

カレンダーをインスタンス化しなくても、整数演算を使用してすべてを実行できます。

return (System.currentTimeMillis()/1000/3600/24/365.25 +1970);

正月に1〜2時間は休むかもしれませんが、問題な印象を受けませんか?


9
おそらくリンゴのために働いていますか?macworld.com/article/2023580/…–
Stefan Paul

うわー、これは非常に重いです。cagcowboyが示したように、シンプルに保つことをお勧めします。
LStrike 2016年

これはすべての状況で最高とは限りませんが、反対票を投じる価値はありません。
JohnnyLambada 2018年

-4

ライブラリの特別な関数を使用して、日/月/年の整数を処理します-

int[] int_dmy( long timestamp ) // remember month is [0..11] !!!
{
  Calendar cal = new GregorianCalendar(); cal.setTimeInMillis( timestamp );
  return new int[] { 
    cal.get( Calendar.DATE ), cal.get( Calendar.MONTH ), cal.get( Calendar.YEAR )
  };
};


int[] int_dmy( Date d ) { 
 ...
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.