Java で現在の年を整数として判断する必要があります。を使用することもできますjava.util.Date()
が、非推奨です。
15 に答える
int year = Calendar.getInstance().get(Calendar.YEAR);
これが新しいカレンダーを設定しないという基準を満たしているかどうかわかりませんか? (なぜそうすることに反対するのですか?)
Java 8 の time API を使用すると (システムのデフォルト タイム ゾーンで年を取得できると仮定して)、次のYear::now
メソッドを使用できます。
int year = Year.now().getValue();
この最も単純な (Calendar を使用して申し訳ありません) は次のとおりです。
int year = Calendar.getInstance().get(Calendar.YEAR);
tl;dr
ZonedDateTime.now( ZoneId.of( "Africa/Casablanca" ) )
.getYear()
タイムゾーン
Raffi Khatchadourianによる回答は、Java 8 で新しいjava.time パッケージを使用する方法を賢明に示しています。
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 年ずつジャンプすることである場合、年数を抽出する必要はありません。Joda-Time と java.time の両方に、一度に年を加算/減算するメソッドがあります。そして、これらの方法はスマートで、夏時間やその他の異常を処理します。
java.timeの例。
ZonedDateTime zdt =
ZonedDateTime
.now( ZoneId.of( "Africa/Casablanca" ) )
.minusYears( 1 )
;
Joda-Time 2.7 の例。
DateTime oneYearAgo = DateTime.now( DateTimeZone.forID( "Africa/Casablanca" ) ).minusYears( 1 ) ;
The easiest way is to get the year from Calendar.
// 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 8 には次のコードを使用します。
LocalDate localDate = LocalDate.now();
int year = localDate.getYear();
int month = localDate.getMonthValue();
int date = localDate.getDayOfMonth();
アプリケーションが Date オブジェクトと Calendar オブジェクトを多用している場合、変更可能なので Joda Time を使用する必要がありますjava.util.Date
。java.util.Calendar
フィールドが更新されるとパフォーマンスの問題があり、日時演算には扱いにくいです。
一部の人々が上で答えたように:
変数を後で使用する場合は、次のように使用することをお勧めします。
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));
}
私の場合、上記のどれも機能しません。だから、多くの解決策を試した後、私は以下の解決策を見つけ、それは私のために働いた
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時間オフになるかもしれませんが、それが問題であるという印象はありませんか?
Java バージョン 8以降では、 java.timeライブラリを使用できます (推奨)。ISO 8601は、日付の標準的な書き方を設定し、それYYYY-MM-DD
をjava.time.Instant
使用しますUTC
。
import java.time.Instant;
int myYear = Integer.parseInt(Instant.now().toString().substring(0,4));
PS 念のため (および getString
ではなくget の略int
)、 usingCalendar
のほうが見栄えがよく、ゾーン対応にすることができます。
ライブラリで特別な関数を使用して、日/月/年の整数を操作します-
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 ) {
...
}