Làm cách nào để tôi nhận được tháng dưới dạng một số nguyên từ một đối tượng Date ( java.util.Date
)?
Làm cách nào để tôi nhận được tháng dưới dạng một số nguyên từ một đối tượng Date ( java.util.Date
)?
Câu trả lời:
Bạn cũng có thể sử dụng gói java.time trong Java 8 và chuyển đổi java.util.Date
đối tượng của mình thành java.time.LocalDate
đối tượng và sau đó chỉ cần sử dụng getMonthValue()
phương thức.
Date date = new Date();
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
int month = localDate.getMonthValue();
Lưu ý rằng các giá trị tháng được đưa ra từ 1 đến 12 trái với cal.get(Calendar.MONTH)
câu trả lời của adarshr đưa ra các giá trị từ 0 đến 11.
Nhưng như Basil Bourque đã nói trong các bình luận, cách ưa thích là lấy một Month
đối tượng enum với LocalDate::getMonth
phương thức này.
ZoneId.of( "America/Montreal" )
.
Month
đối tượng enum chứ không phải là một số nguyên. Month m = localDate.gotMonth();
Xem LocalDate::getMonth
phương pháp. Việc sử dụng các đối tượng như thế này làm cho mã của bạn tự ghi lại tài liệu, đảm bảo an toàn kiểu và đảm bảo các giá trị hợp lệ. Xem hướng dẫn Enum của Oracle.
date.toInstant()
và bạn tình cờ làm việc với java.sql.Date
(con của java.util.Date
) thì bạn sẽ nhận được UnsupportedOperationException
. Hãy thửnew java.sql.Date(src.getTime()).toLocalDate()
java.sql.Date
bằng cách sử dụng các phương thức chuyển đổi mới được thêm vào lớp cũ đó. java.sql.Date.valueOf( myLocalDate )
và myJavaSqlDate.toLocalDate()
Ngoài ra, trình điều khiển JDBC được cập nhật cho JDBC 4.2 trở lên không còn cần java.sql
các loại và có thể trực tiếp giải quyết java.time
các loại thông qua các phương thức ResultSet::getObject
và PreparedStatement::setObject
.
java.util.Date date= new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int month = cal.get(Calendar.MONTH);
Calendar.MONTH
không có lý do rõ ràng dựa trên ZERO, tức là tháng 1 == 0. Bây giờ, tài liệu này chỉ hoạt động tốt trong API, nhưng nó vẫn gây nhầm lẫn cho người dùng lần đầu. Tôi vẫn chưa tìm thấy ai có thể cho tôi biết lý do tại sao họ lại đi với điều đó - có lẽ đã đến lúc tôi có một câu hỏi SO mới (mặc dù tôi sợ không có bất kỳ nền tảng tuyệt vời nào về điều đó: /)
getYear()
cũng vậy, "không có lý do rõ ràng", bị trừ vào năm 1900.
Nếu bạn sử dụng api Java 8 ngày, bạn có thể trực tiếp lấy nó trong một dòng!
LocalDate today = LocalDate.now();
int month = today.getMonthValue();
Ngoài ra, với lớp Joda-Time DateTime
.
//convert date to datetime
DateTime datetime = new DateTime(date);
int month = Integer.parseInt(datetime.toString("MM"))
…hoặc là…
int month = dateTime.getMonthOfYear();
DateTime
đối tượng cho tháng của nó. int month = dateTime.getMonthOfYear();
.toString("MM")
vì nó cho thấy có nhiều khả năng hơn là "MM".
DateTimeZone
đối tượng đến hàm tạo 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
Chi tiếtCâu trả lời của Ortomala Lokni cho việc sử dụng java.time là chính xác. Và bạn nên sử dụng java.time vì đây là một cải tiến vượt bậc so với các lớp java.util.Date/.CalWiki cũ. Xem Hướng dẫn của Oracle trên java.time.
Tôi sẽ thêm một số mã cho biết cách sử dụng java.time mà không cần quan tâm đến java.util.Date, khi bạn bắt đầu với mã mới.
Sử dụng java.time một cách ngắn gọn Instant
là An An là một khoảnh khắc trên dòng thời gian trong UTC. Áp dụng múi giờ ( ZoneId
) để có được a ZonedDateTime
.
Các Month
lớp là một tinh vi enum để đại diện cho một tháng nói chung. Enum đó có các phương thức tiện dụng như lấy tên địa phương. Và hãy yên tâm rằng số tháng trong java.time là một số lành mạnh, 1-12, không phải là vô nghĩa dựa trên số không (0-11) được tìm thấy trong java.util.Date/.CalWiki.
Để có được thời gian hiện tại, múi giờ là rất quan trọng. Tại bất kỳ thời điểm nào, ngày không giống nhau trên toàn thế giới. Do đó, tháng không giống nhau trên toàn thế giới nếu gần cuối / đầu tháng.
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 );
Các java.time khung được xây dựng vào Java 8 và sau đó. Những lớp học thay thế cái cũ phiền hà di sản lớp học ngày thời gian như java.util.Date
, Calendar
, & SimpleDateFormat
.
Các Joda thời gian dự án, bây giờ trong chế độ bảo trì , khuyên chuyển đổi sang các java.time lớp.
Để tìm hiểu thêm, xem Hướng dẫn Oracle . Và tìm kiếm Stack Overflow cho nhiều ví dụ và giải thích. Đặc điểm kỹ thuật là JSR 310 .
Bạn có thể trao đổi các đối tượng java.time trực tiếp với cơ sở dữ liệu của bạn. Sử dụng trình điều khiển JDBC tương thích với JDBC 4.2 trở lên. Không cần chuỗi, không cần java.sql.*
lớp.
Nơi để có được các lớp java.time?
Các ThreeTen-Extra dự án mở rộng java.time với các lớp bổ sung. Dự án này là một nền tảng chứng minh cho các bổ sung có thể trong tương lai cho java.time. Bạn có thể tìm thấy một số lớp hữu ích ở đây nhưInterval
, YearWeek
, YearQuarter
, và nhiều hơn nữa .
Nếu bạn không thể sử dụng thời gian của Joda và bạn vẫn sống trong thế giới đen tối :) (Java 5 hoặc thấp hơn), bạn có thể tận hưởng điều này:
Lưu ý: Đảm bảo rằng ngày của bạn đã được thực hiện theo định dạng: 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
Giá trị trả về bắt đầu từ 0, vì vậy bạn nên thêm một vào kết quả.
new Date()
mà không cần System.currentTimeMillis
. Khác là getMonth không được dùng nữa.