Dateオブジェクト(java.util.Date
)から整数として月を取得するにはどうすればよいですか?
Dateオブジェクト(java.util.Date
)から整数として月を取得するにはどうすればよいですか?
回答:
また、使用することができますjava.timeパッケージを Javaの8にして、変換java.util.Date
にオブジェクトをjava.time.LocalDate
オブジェクトとそしてちょうど使用getMonthValue()
方法を。
Date date = new Date();
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
int month = localDate.getMonthValue();
ここで、月の値は、1から12までの範囲で与えられます cal.get(Calendar.MONTH)
、0から11の値を与えるadarshrの回答とは、。
しかし、Basil Bourqueがコメントで言ったように、推奨される方法はMonth
、LocalDate::getMonth
メソッドでenumオブジェクトを取得することです。
ZoneId.of( "America/Montreal" )
。
Month
列挙オブジェクトを取得することもできます。メソッドをMonth m = localDate.gotMonth();
参照してくださいLocalDate::getMonth
。このようなオブジェクトを使用すると、コードが自己文書化され、型の安全性が保証され、有効な値が保証されます。OracleによるEnumチュートリアルを参照してください。
date.toInstant()
していて、たまたまjava.sql.Date
(の子java.util.Date
)を操作している場合は、を取得しUnsupportedOperationException
ます。試してみるnew java.sql.Date(src.getTime()).toLocalDate()
java.sql.Date
その古いクラスに追加された新しい変換メソッドを使用することで、変換がはるかに簡単になります。java.sql.Date.valueOf( myLocalDate )
そしてmyJavaSqlDate.toLocalDate()
また、JDBCドライバは、JDBC 4.2以降不要になったのに更新java.sql
を直接アドレスすることができますタイプ、およびjava.time
経由種類をResultSet::getObject
し、PreparedStatement::setObject
方法。
java.util.Date date= new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int month = cal.get(Calendar.MONTH);
Calendar.MONTH
明らかな理由がないことに注意してください。ゼロベース、つまり、January == 0。これでAPIで問題なく文書化されましたが、それでも初めてのユーザーにとっては地獄と混同しています。:多分時間を新しいSOの質問自分のために(/私は恐れているがそれにすべての偉大な背景が存在しない) -私は、彼らはそれと一緒に行った理由を教えてもらえ誰も見つけることがまだまし
getYear()
1900減算、「明白な理由のために」もある
または、Joda-Time DateTime
クラスを使用します。
//convert date to datetime
DateTime datetime = new DateTime(date);
int month = Integer.parseInt(datetime.toString("MM"))
…または…
int month = dateTime.getMonthOfYear();
DateTime
オブジェクトの月を尋ねるだけです。int month = dateTime.getMonthOfYear();
.toString("MM")
「MM」以外にも可能性があることを示しているので、私は好きです。
DateTimeZone
オブジェクトをそのDateTimeコンストラクターに渡すことをお勧めします:DateTimeZone.forID( "America/Montreal" )
。
myUtilDate.toInstant() // Convert from legacy class to modern. `Instant` is a point on the timeline in UTC.
.atZone( // Adjust from UTC to a particular time zone to determine date. Renders a `ZonedDateTime` object.
ZoneId.of( "America/Montreal" ) // Better to specify desired/expected zone explicitly than rely implicitly on the JVM’s current default time zone.
) // Returns a `ZonedDateTime` object.
.getMonthValue() // Extract a month number. Returns a `int` number.
java.time
細部回答使用するためのOrtomala Lokniによってjava.timeは正しいです。また、java.timeは古いjava.util.Date/.Calendarクラスに比べて大幅に改善されているため、使用する必要があります。Oracleチュートリアルを見るjava.timeを。
新しいコードから始める場合のために、java.util.Dateに関係なくjava.timeを使用する方法を示すコードをいくつか追加します。
簡単に言えば、java.timeの使用… Instant
は、UTCのタイムライン上の瞬間です。タイムゾーン(ZoneId
)を適用してZonedDateTime
ます。
Month
クラスは、洗練された列挙型、一般的に月を表現します。その列挙には、ローカライズされた名前を取得するなどの便利なメソッドがあります。また、java.timeの月数は、java.util.Date / .Calendarにあるゼロベースのナンセンス(0-11)ではなく、1〜12の正気なものであることを確認してください。
現在の日時を取得するには、タイムゾーンが重要です。いつでも日付は世界中で同じではありません。したがって、月の終わり/初めに近い場合、月は世界中で同じではありません。
ZoneId zoneId = ZoneId.of( "America/Montreal" ); // Or 'ZoneOffset.UTC'.
ZonedDateTime now = ZonedDateTime.now( zoneId );
Month month = now.getMonth();
int monthNumber = month.getValue(); // Answer to the Question.
String monthName = month.getDisplayName( TextStyle.FULL , Locale.CANADA_FRENCH );
java.timeのフレームワークは、Java 8に組み込まれており、後にされています。これらのクラスは面倒古い取って代わるレガシーのような日付時刻クラスjava.util.Date
、Calendar
&を、SimpleDateFormat
。
ジョダタイムプロジェクトは、今でメンテナンスモードへの移行をアドバイスjava.timeのクラス。
詳細については、Oracleチュートリアルを参照してください。スタックオーバーフローで多くの例と説明を検索してください。仕様はJSR 310です。
java.timeオブジェクトをデータベースと直接交換することができます。JDBC 4.2以降に準拠したJDBCドライバーを使用します。文字列もクラスも必要ありません。java.sql.*
java.timeクラスはどこで入手できますか?
ThreeTen-エクストラプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、java.timeに将来追加される可能性があることを証明する場です。あなたはここにいくつかの有用なクラスのような見つけることがInterval
、YearWeek
、YearQuarter
、および多くを。
Joda時間を使用できず、まだ暗い世界に住んでいる場合:)(Java 5以下)これを楽しむことができます:
注:日付が次の形式で作成されていることを確認してください:dd / MM / YYYY
/**
Make an int Month from a date
*/
public static int getMonthInt(Date date) {
SimpleDateFormat dateFormat = new SimpleDateFormat("MM");
return Integer.parseInt(dateFormat.format(date));
}
/**
Make an int Year from a date
*/
public static int getYearInt(Date date) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy");
return Integer.parseInt(dateFormat.format(date));
}
Date mDate = new Date(System.currentTimeMillis());
mDate.getMonth() + 1
戻り値は0から始まるため、結果に1を追加する必要があります。
new Date()
使わずに現在の日付を作成できることSystem.currentTimeMillis
です。もう1つは、getMonthが非推奨であることです。