私はAndroidに関連した学習プロジェクトに取り組んでいます。以下のコードを使用して現在の年と月を取得しようとしていますが、うまくいきません。
GregorianCalendar gc = new GregorianCalendar();
gc.YEAR // returning 1
gc.MONTH // returning 2
Calendar c = Calendar.getInstance();
c.YEAR // returning 1
c.MONTH // returning 2
誰か助けてくれますか?私は何か間違っていますか? Java開発。ありがとう。
もう少し背景を説明します。
new GregorianCalendar()
とCalendar.getInstance()
の両方は、現在の日付と時刻に初期化されたカレンダーを正しく与えます。
MONTH
およびYEAR
は、 Calendar
クラス内のconstantsです。あなたはnot参照を「経由」して、オブジェクトの状態の一部のように見えるようにする必要があります。 Calendar
クラスの設計の不幸な部分です。異なるフィールドの値にアクセスするには、以下に示すように、これらの定数の1つとして指定されたフィールド番号でget
を呼び出す必要があります他の答え:
Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
月番号は0から始まるため、この記事の執筆時点(4月)では、月番号は3になります。
これは、canが静的メンバー(定数など)を参照するJava言語の設計の不幸な部分ですタイプ名によるonlyではなく、そのタイプの式。
私の推奨事項:
c.YEAR
などの式を作成すると、コンパイル時エラーが発生します。常にCalendar.YEAR
を使用すると、より明確なコードになります。MONTHSは0から始まることに注意してください。実際の問題にマッピングする必要がある場合は、+ 1を追加してください。
int month=c.get(Calendar.MONTH)+1;
int year=c.get(Calendar.YEAR);
int month=c.get(Calendar.MONTH);
System.out.println(year);
System.out.println(month);
YearMonth.now(
ZoneId.of( "America/Montreal" )
)
Jon Skeetによる回答 は正しいです。自分のオブジェクトに問い合わせるのではなく、定数にアクセスしていました。
これは、最新の日時クラスを使用したまったく異なる選択肢です。
Java.util.Date
、 Java.util.Calendar
、およびJava.text.SimpleTextFormat
などの古い日時クラスは legacy 、 Java.time クラスに取って代わりました。
YearMonth
日付、時刻、およびタイムゾーンのない年と月に焦点を合わせている場合は、 YearMonth
クラスを使用します。
年や月に単なる整数を渡すのではなく、このクラスのオブジェクトを渡します。そうすることで、タイプセーフが提供され、有効な値が確保され、コードがより自己文書化されます。
現在の年と月を特定するということは、現在の日付を特定することを意味します。そのためには、タイムゾーンが重要です。どのような場合でも、日付はゾーンごとに世界中で異なります。
ZoneId z = ZoneId.of( "America/Montreal" );
YearMonth ym = YearMonth.now( z );
部品について問い合わせることができます。
int year = ym.getYear();
int month = ym.getMonthValue();
このクラスは、this年かどうかを知らせるなどの便利なメソッドを提供します。月/年の加算/減算などの数学を実行できます。今年のどの月の日付も取得できます。もっと。
Month
月の単なる整数で混乱するのではなく、 Month
enumを使用することをお勧めします。このクラスには、1年の各月に1つずつ、事前に定義された多数のインスタンスがあります。前述のように、オブジェクトを使用すると、タイプセーフ、有効な値、および自己文書化コードが得られます。
Month m = ym.getMonth();
クラスには、月の名前でローカライズされた文字列を生成するなどの便利なメソッドがあります。
Java.time フレームワークはJava 8以降に組み込まれています。これらのクラスは、面倒な古い legacy のような日時クラスに取って代わります- Java.util.Date
、 Calendar
、& SimpleDateFormat
。
Joda-Time プロジェクトは、現在 メンテナンスモード であり、 Java.time クラスへの移行を推奨しています。
詳細については、 Oracle Tutorial を参照してください。また、Stack Overflowで多くの例と説明を検索してください。指定は JSR 31 です。
Java.timeクラスはどこで入手できますか?
Calendar c= Calendar.getInstance()
int cyear = c.get(Calendar.YEAR);//calender year starts from 1900 so you must add 1900 to the value recevie.i.e., 1990+112 = 2012
int cmonth = c.get(Calendar.MONTH);//this is april so you will receive 3 instead of 4.
int cday = c.get(Calendar.DAY_OF_MONTH);
これを参照してください [〜#〜] link [〜#〜]
Calendar calendar = Calendar.getInstance();
int month = calendar.get(Calendar.MONTH) + 1;
int year = calendar.get(Calendar.YEAR);
最初の月の値は0であるため、正しい月を取得するには1を追加することが非常に重要です。
int month = calendar.get(Calendar.MONTH) + 1;
[〜#〜] month [〜#〜] :月を示すgetおよびsetのフィールド番号。これはカレンダー固有の値です。グレゴリオ暦とユリウス暦の年の最初の月はJANUARYで0です。最後は1年の月数に依存します。