質問
Javaの現在の年を整数として決定する必要があります。 java.util.Date()
を使用できますが、非推奨です。
解決
int year = Calendar.getInstance().get(Calendar.YEAR);
これが新しいカレンダーを設定しないという基準を満たしているかどうかわかりませんか? (なぜそうすることに反対するのですか?)
他のヒント
Java 8のTime APIを使用すると(システムのデフォルトのタイムゾーンで年を取得できると仮定して)、 Year :: now
メソッド:
int year = Year.now().getValue();
この最も単純な(カレンダーを使用して申し訳ありません):
int year = Calendar.getInstance().get(Calendar.YEAR);
最も簡単な方法は、カレンダーから年を取得することです。
// year is stored as a static member
int year = Calendar.getInstance().get(Calendar.YEAR);
日付オブジェクトの年が必要な場合は、次の方法を使用しました:
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;
}
java.time.YearMonth
から2つのメソッドを使用することもできます(Java 8以降):
import java.time.YearMonth;
...
int year = YearMonth.now().getYear();
int month = YearMonth.now().getMonthValue();
tl; dr
ZonedDateTime.now( ZoneId.of( "Africa/Casablanca" ) )
.getYear()
タイムゾーン
int year = LocalDate.now()。getYear();
このコードは、JVMの現在のデフォルトのタイムゾーンに依存します。デフォルトのゾーンは、今日の日付を決定する際に使用されます。たとえば、パリの真夜中を過ぎた瞬間、モントルの日付はまだ「昨日」であることを思い出してください。
結果は、実行するマシン、ホストOSのタイムゾーンを変更するユーザー/管理者、またはJVMの現在のデフォルトを変更するJavaコード によって異なる場合があります。タイムゾーンを指定する方が良い。
ところで、常に適切なタイムゾーン名を IANAによって定義。標準化されておらず、一意でもない3〜4文字のコードを使用しないでください。
java.time
Java 8のjava.timeの例
int year = ZonedDateTime.now( ZoneId.of( "Africa/Casablanca" ) ).getYear() ;
Joda-Time
上記のようなアイデアですが、 Joda-Time 2.7ライブラリを使用しています。
int year = DateTime.now( DateTimeZone.forID( "Africa/Casablanca" ) ).getYear() ;
年の増分/減分
1年に1度ジャンプすることが目標の場合、年番号を抽出する必要はありません。 Joda-Timeとjava.timeの両方に、一度に1年を加算/減算するメソッドがあります。また、これらのメソッドはスマートで、夏時間やその他の異常を処理します。
Joda-Time 2.7の例。
DateTime oneYearAgo = DateTime.now( DateTimeZone.forID( "Africa/Casablanca" ) ).minusYears( 1 ) ;
アプリケーションがDateおよびCalendarオブジェクトを多用している場合、 java.util.Date
は可変であるため、実際にはJoda Timeを使用する必要があります。 java.util.Calendar
には、フィールドが更新されたときにパフォーマンスの問題があり、日時の計算には不格好です。
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で使用する:
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));
}
カレンダーをインスタンス化する必要なく、整数演算を使用してすべてを実行できます。
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 ) {
...
}