ฉันจะรับเดือนเป็นจำนวนเต็มจากวัตถุ 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)
ข้ามกับคำตอบของ adarshr ซึ่งให้ค่าตั้งแต่ 0 ถึง 11
แต่ตามที่ Basil Bourque กล่าวในความคิดเห็นวิธีที่ต้องการคือการรับMonth
วัตถุ enum ด้วยLocalDate::getMonth
วิธีการ
ZoneId.of( "America/Montreal" )
หากคุณสนใจเฉพาะเกี่ยวกับมอนทรีออใช้
Month
วัตถุ enumมากกว่าจำนวนเต็มเพียง Month m = localDate.gotMonth();
ดูLocalDate::getMonth
วิธีการ การใช้ออบเจ็กต์เช่นนี้ทำให้โค้ดของคุณเป็นเอกสารด้วยตนเองทำให้มั่นใจถึงความปลอดภัยของประเภทและรับประกันค่าที่ถูกต้อง ดูEnum บทช่วยสอนโดย Oracle
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
ไม่มีเหตุผลที่ชัดเจนตาม ZERO เช่นมกราคม == 0 ตอนนี้เอกสารนั้นใช้ได้ใน API แต่ก็ยังสับสนเหมือนเป็นครั้งแรกสำหรับผู้ใช้ ฉันยังไม่พบใครที่สามารถบอกฉันได้ว่าทำไมพวกเขาถึงทำอย่างนั้น - อาจถึงเวลาสำหรับคำถาม SO ใหม่ด้วยตัวเอง (แม้ว่าฉันกลัวว่าจะไม่มีภูมิหลังที่ยอดเยี่ยมสำหรับ: /)
getYear()
เป็นเช่นนั้น "ด้วยเหตุผลที่ไม่ชัดเจน" ถูกลบออกในปี 1900
หากคุณใช้Java 8 date API คุณสามารถรับได้โดยตรงในบรรทัดเดียว!
LocalDate today = LocalDate.now();
int month = today.getMonthValue();
อีกทางเลือกหนึ่งด้วยคลาส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.time โดยไม่คำนึงถึง java.util.Date สำหรับเมื่อคุณเริ่มต้นด้วยรหัสสด
การใช้ java.time โดยย่อ… Instant
หนึ่งนาทีบนเส้นเวลาใน UTC สมัครโซนเวลา ( ZoneId
) ZonedDateTime
เพื่อให้ได้
Month
ชั้นที่มีความซับซ้อนenumเพื่อเป็นตัวแทนของเดือนโดยทั่วไป Enum นั้นมีวิธีการที่สะดวกเช่นรับชื่อที่มีการแปล และมั่นใจได้ว่าจำนวนเดือนใน java.time เป็นตัวเลขที่มีสติ 1-12 ไม่ใช่เรื่องไร้สาระที่เป็นศูนย์ (0-11) ที่พบใน java.util.Date/.Calendar
เพื่อให้ได้รับวันเวลาปัจจุบันเขตเวลาเป็นสิ่งสำคัญ ไม่ว่าช่วงเวลาใดวันนั้นจะไม่เหมือนกันทั่วโลก ดังนั้นเดือนไม่เหมือนกันทั่วโลกถ้าใกล้สิ้นสุด / เริ่มต้นของเดือน
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
Joda เวลาโครงการขณะนี้อยู่ในโหมดการบำรุงรักษาให้คำแนะนำแก่การโยกย้ายไปยังjava.timeชั้นเรียน
ต้องการเรียนรู้เพิ่มเติมโปรดดูที่ออราเคิลกวดวิชา และค้นหา Stack Overflow สำหรับตัวอย่างและคำอธิบายมากมาย สเปกJSR 310
คุณสามารถแลกเปลี่ยนวัตถุjava.timeโดยตรงกับฐานข้อมูลของคุณ ใช้ไดรเวอร์ JDBC ที่สอดคล้องกับJDBC 4.2หรือใหม่กว่า ไม่จำเป็นต้องใช้สตริงไม่จำเป็นต้องมีjava.sql.*
คลาส
จะรับคลาส java.time ได้ที่ไหน?
โครงการThreeTen-Extraขยาย 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 ดังนั้นคุณควรเพิ่มหนึ่งรายการในผลลัพธ์
new Date()
System.currentTimeMillis
อีกอย่างคือ getMonth นั้นเลิกใช้แล้ว