回答:
int year = Calendar.getInstance().get(Calendar.YEAR);
これが新しいカレンダーを設定しないという基準を満たしているかどうかわかりませんか?(なぜそうすることに反対するのですか?)
Calendar.getInstance().get(Calendar.YEAR)
外部で変更されるクロックに関してはアトミックでsynchronized(c)
あり、ローカル変数の新規インスタンスで実行しても、ここでは非常に無意味です。
import java.util.Calendar
Java 8の時刻APIを使用して(システムのデフォルトのタイムゾーンで年を取得してもよいと仮定した場合)、次のYear::now
メソッドを使用できます。
int year = Year.now().getValue();
ZoneId
するのnow
ではなく、常にオプションの引数を渡すことをお勧めします(実行時にいつでも変更可能です!)。
int year = Year.now(ZoneId.of("America/New_York")).getValue();
docs.oracle.com/javase/8/docs/api/java/time/Year.html#now--
この最も簡単な(カレンダーを使用して、申し訳ありません)は次のとおりです。
int year = Calendar.getInstance().get(Calendar.YEAR);
最も簡単な方法は、カレンダーから年を取得することです。
// year is stored as a static member
int year = Calendar.getInstance().get(Calendar.YEAR);
java.time.YearMonth
(Java 8以降)の2つのメソッドを使用することもできます。
import java.time.YearMonth;
...
int year = YearMonth.now().getYear();
int month = YearMonth.now().getMonthValue();
日付オブジェクトの年が必要な場合は、次の方法を使用しました。
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;
}
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 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 ) ;
tzdata
データファイルの新しいコピーを自分でダウンロードしてください。ファイルを閲覧できます。また、Java実装で古いtzdataを置き換えることができます。Oracleは、JVM用の更新ツールを提供しています。
Java 8も使用できますLocalDate
。
import java.time.LocalDate;
//...
int year = LocalDate.now().getYear();
一部の人々が上記で答えたように:
後で変数を使用する場合は、より適切に使用します。
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));
}
私の場合、上記のどれも機能しません。だから多くの解決策を試した後、私は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);
}
}
カレンダーをインスタンス化しなくても、整数演算を使用してすべてを実行できます。
return (System.currentTimeMillis()/1000/3600/24/365.25 +1970);
正月に1〜2時間は休むかもしれませんが、問題な印象を受けませんか?
ライブラリの特別な関数を使用して、日/月/年の整数を処理します-
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 ) {
...
}
java.util.Date
では非推奨ではありません。そのメソッドの一部は非推奨ですが、クラス全体ではありません。しかし、両方java.util.Date
を避けてくださいjava.util.Calendar
。悪名高いほど厄介で、混乱し、欠陥があるためです。代わりに、java.time(Java 8の場合)またはJoda -Timeを使用してください。