web-dev-qa-db-ja.com

現在の年と月を取得すると、奇妙な結果が生じます

私は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開発。ありがとう。

24
Yaqub Ahmad

もう少し背景を説明します。

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ではなく、そのタイプの式。

私の推奨事項:

  • IDEで許可されている場合(Eclipseのように)、c.YEARなどの式を作成すると、コンパイル時エラーが発生します。常にCalendar.YEARを使用すると、より明確なコードになります。
  • 可能な場合は、 Joda Time を使用します。これは、Java用のはるかに優れた日付/時刻ライブラリです。確かにAndroid少しスペースに制約があるかもしれませんが、アプリで多くの日付/時刻操作を行うと、多くの頭痛の種を節約できます。
63
Jon Skeet

MONTHSは0から始まることに注意してください。実際の問題にマッピングする必要がある場合は、+ 1を追加してください。

int month=c.get(Calendar.MONTH)+1;
21
Bala Vishnu
int year=c.get(Calendar.YEAR);
int month=c.get(Calendar.MONTH);

   System.out.println(year);
   System.out.println(month);
5

tl; dr

YearMonth.now( 
    ZoneId.of( "America/Montreal" ) 
)

詳細

Jon Skeetによる回答 は正しいです。自分のオブジェクトに問い合わせるのではなく、定数にアクセスしていました。

これは、最新の日時クラスを使用したまったく異なる選択肢です。

レガシーの日時クラスを避ける

Java.util.DateJava.util.Calendar 、およびJava.text.SimpleTextFormatなどの古い日時クラスは legacyJava.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.time フレームワークはJava 8以降に組み込まれています。これらのクラスは、面倒な古い legacy のような日時クラスに取って代わります- Java.util.DateCalendar 、& SimpleDateFormat

Joda-Time プロジェクトは、現在 メンテナンスモード であり、 Java.time クラスへの移行を推奨しています。

詳細については、 Oracle Tutorial を参照してください。また、Stack Overflowで多くの例と説明を検索してください。指定は JSR 31 です。

Java.timeクラスはどこで入手できますか?

  • Java SE 8 および SE 9 以降
    • ビルトイン。
    • 標準の一部Java実装がバンドルされたAPI。
    • Java 9は、いくつかのマイナーな機能と修正を追加します。
  • Java SE 6 および SE 7
  • Android
    • ThreeTenABP プロジェクトは適応しますThreeTen-Backport(上記)Android具体的に。
    • 使用方法… を参照してください。
3
Basil Bourque
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 [〜#〜]

2
Shankar Agarwal

現在の年と月を取得する方法。

        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年の月数に依存します。

1
Jorgesys