Bir Date nesnesinden ( java.util.Date
) tamsayı olarak ayı nasıl alabilirim ?
Bir Date nesnesinden ( java.util.Date
) tamsayı olarak ayı nasıl alabilirim ?
Yanıtlar:
Java 8'deki java.time paketini kullanabilir ve nesnenizijava.util.Date
bir java.time.LocalDate
nesneye dönüştürebilir ve sonra getMonthValue()
yöntemi kullanabilirsiniz .
Date date = new Date();
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
int month = localDate.getMonthValue();
Burada ay değerlerinin cal.get(Calendar.MONTH)
adarshr cevabının aksine 1 ila 12 arasında verildiğini ve bu da 0 ila 11 arasında değerler verdiğini unutmayın.
Ancak Basil Bourque'ın yorumlarda söylediği gibi, tercih edilen yöntem yöntemle bir Month
enum nesnesi elde etmektir LocalDate::getMonth
.
ZoneId.of( "America/Montreal" )
.
Month
enum nesnesi de alabilirsiniz . Month m = localDate.gotMonth();
Bkz. LocalDate::getMonth
Yöntem. Bunun gibi nesnelerin kullanılması, kodunuzun kendi kendini belgelemesini sağlar, tip güvenliği sağlar ve geçerli değerleri garanti eder. Oracle'ın Enum öğreticisine bakın .
date.toInstant()
ve java.sql.Date
(çocuğuyla java.util.Date
) birlikte çalışıyorsanız o zaman bir UnsupportedOperationException
. Deneyinnew java.sql.Date(src.getTime()).toLocalDate()
java.sql.Date
Eski sınıfa eklenen yeni dönüştürme yöntemlerini kullanarak / dönüştürmek çok daha kolay . java.sql.Date.valueOf( myLocalDate )
ve myJavaSqlDate.toLocalDate()
Ayrıca JDBC sürücüleri JDBC 4.2 için güncellenmiş ya da geç artık ihtiyaç java.sql
türleri ve can doğrudan adres java.time
tipleri aracılığıyla ResultSet::getObject
ve PreparedStatement::setObject
yöntemler.
java.util.Date date= new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int month = cal.get(Calendar.MONTH);
Calendar.MONTH
ZERO tabanlı hiçbir belirgin nedeni olmadığını, yani Ocak == 0 olduğunu unutmayın. Şimdi bu API'da gayet iyi belgelenmiş, ancak ilk kez kullananlar için hala kafa karıştırıcı. Bana neden bununla gittiğini söyleyebilecek birini bulamadım - belki de kendim için yeni bir SO sorusu zamanı (bunun için büyük bir arka plan olmadığından korkuyorum: /)
getYear()
da, "hiçbir belirgin nedenden ötürü", 1900 tarafından çıkarıldı.
Eğer kullanırsanız Java 8 tarih api, doğrudan bir satırda alabilirsiniz!
LocalDate today = LocalDate.now();
int month = today.getMonthValue();
Alternatif olarak, Joda-Time DateTime
sınıfıyla.
//convert date to datetime
DateTime datetime = new DateTime(date);
int month = Integer.parseInt(datetime.toString("MM"))
…veya…
int month = dateTime.getMonthOfYear();
DateTime
nesnenin ayını isteyin . int month = dateTime.getMonthOfYear();
.toString("MM")
gösterdiği gibi sadece "MM" den daha fazla olasılık var.
DateTimeZone
o DateTime yapıcı nesneyi: 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
ayrıntılarCevap kullanmak için Ortomala Lokni tarafından java.time doğrudur. Ve gerektiğini eski java.util.Date/.Calendar sınıflar üzerinde dev bir gelişme olarak java.time kullanıyor. Java.time ile ilgili Oracle Tutorial'a bakın .
Yeni kodla başladığınızda, java.util.Date'e bakmadan java.time'ın nasıl kullanılacağını gösteren bazı kodlar ekleyeceğim.
Özetle java.time kullanma… An Instant
, UTC'de zaman çizelgesinde geçen bir andır. Almak için bir saat dilimi ( ZoneId
) uygulayın ZonedDateTime
.
Month
Sınıf bir sofistike enum genel olarak bir ay temsil etmek. Bu numaralandırma yerelleştirilmiş bir ad alma gibi kullanışlı yöntemlere sahiptir. Ve java.time içindeki ay numarasının, java.util.Date/.Calendar içinde bulunan sıfır tabanlı saçmalık (0-11) değil, 1-12 aklı başında olduğundan emin olun.
Geçerli tarih-saati almak için saat dilimi çok önemlidir. Her an, tarih dünyanın her yerinde aynı değildir . Bu nedenle, ayın sonuna / başlangıcına yakınsa, ay dünya çapında aynı değildir.
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 çerçevesi daha sonra Java 8 ve yerleşiktir. Bu sınıflar zahmetli eski yerini mirası gibi tarih-saat sınıfları java.util.Date
, Calendar
& SimpleDateFormat
.
Artık bakım modunda olan Joda-Time projesi java.time sınıflarına geçişi tavsiye ediyor .
Daha fazla bilgi için Oracle Eğiticisine bakın . Ve birçok örnek ve açıklama için Stack Overflow'da arama yapın. Spesifikasyon JSR 310'dur .
Sen değiştirebilir java.time sizin veritabanı ile doğrudan nesneleri. JDBC 4.2 veya sonraki bir sürümüyle uyumlu bir JDBC sürücüsü kullanın . Dizeye gerek yok, sınıflara gerek yok .java.sql.*
Java.time sınıflarını nereden edinebilirsiniz?
ThreeTen-Ekstra proje ek sınıfları ile java.time uzanır. Bu proje, java.time'a gelecekteki olası eklemeler için bir kanıt zeminidir. Burada bazı yararlı sınıfları gibi bulabilir Interval
, YearWeek
, YearQuarter
, ve daha .
Joda zamanını kullanamıyorsanız ve hala karanlık dünyada yaşıyorsanız :) (Java 5 veya daha düşük) bunun keyfini çıkarabilirsiniz:
Not: Tarihinizin zaten şu biçimde olduğundan emin olun: gg / AA / 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
Döndürülen değer 0'dan başlar, bu nedenle sonuca bir tane eklemeniz gerekir.
new Date()
olmadan bir tarih yapabilirsiniz System.currentTimeMillis
. Diğeri getMonth'un kullanımdan kaldırılmasıdır.