質問

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);

新しい Date and Time API JSR Joda Time

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

// 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()

タイムゾーン

"> 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年に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 ) { 
 ...
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top