Tạo đối tượng ngày java từ năm, tháng, ngày


94
int day = Integer.parseInt(request.getParameter("day"));  // 25
int month = Integer.parseInt(request.getParameter("month")); // 12
int year = Integer.parseInt(request.getParameter("year")); // 1988

System.out.println(year);

Calendar c = Calendar.getInstance();
c.set(year, month, day, 0, 0);  

b.setDob(c.getTime());

System.out.println(b.getDob());  

Đầu ra là:


Thứ 4, ngày 25 tháng 1 năm 1988 00:00:08 IST 1989

Tôi đang đi qua 25 12 1988nhưng tôi nhận được 25 Jan 1989. Tại sao?


1
B là gì trong mã?
MysteryGuy

Câu trả lời:


109

Các tháng được dựa trên 0 trong Lịch. Vì vậy, 12 được hiểu là tháng mười hai + 1 tháng. Sử dụng

c.set(year, month - 1, day, 0, 0);  

5
Các nhà thiết kế API của IBM, các nhà thiết kế API JavaScript. Ngoài ra, có lẽ không ai cả. Lưu ý rằng Lịch hiện đã bị chặn bởi API java.time của Java 8, điều này thực hiện đúng.
JB Nizet

63

Đó là cách yêu thích của tôi trước Java 8:

Date date = new GregorianCalendar(year, month - 1, day).getTime();

Tôi muốn nói rằng đây là một cách tiếp cận rõ ràng hơn:

calendar.set(year, month - 1, day, 0, 0);

4
Tháng có thể được chỉ định bằng cách sử dụng Calendarhằng số, ví dụ. Calendar.FEBRUARY.
Geekarist

1
Hãy cẩn thận, các tháng được đánh số từ 0 trong Java 7. Sử dụng hằng số để tránh rắc rối.
jediz

25

java.time

Sử dụng java.timekhuôn khổ được tích hợp trong Java 8

int year = 2015;
int month = 12;
int day = 22;
LocalDate.of(year, month, day); //2015-12-22
LocalDate.parse("2015-12-22"); //2015-12-22
//with custom formatter 
DateTimeFormatter.ofPattern formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
LocalDate.parse("22-12-2015", formatter); //2015-12-22

Nếu bạn cũng cần thông tin về thời gian (giờ, phút, giây), hãy sử dụng một số chuyển đổi từ LocalDatesangLocalDateTime

LocalDate.parse("2015-12-22").atStartOfDay() //2015-12-22T00:00

Câu trả lời tốt, nhưng hãy chỉ định múi giờ nếu biết. A LocalDatekhông có múi giờ và do đó không đại diện cho một thời điểm chính xác trên dòng thời gian. Nếu hoàn cảnh của bạn chỉ ra một múi giờ, áp dụng nó để có được một ZonedDateTimeđối tượng: LocalDate.parse("2015-12-22").atStartOfDay( ZoneId.of( "America/Montreal" ) )
Basil Bourque

8

Biểu diễn Lịch của Java không phải là tốt nhất, họ đang làm việc trên nó cho Java 8. Tôi khuyên bạn nên sử dụng Joda Time hoặc một thư viện tương tự khác.

Dưới đây là một ví dụ nhanh bằng cách sử dụng LocalDate từ thư viện Joda Time:

LocalDate localDate = new LocalDate(year, month, day);
Date date = localDate.toDate();

Ở đây bạn có thể làm theo hướng dẫn bắt đầu nhanh.


6

Xem JavaDoc :

tháng - giá trị được sử dụng để đặt trường lịch THÁNG. Giá trị tháng dựa trên 0. ví dụ: 0 cho tháng Giêng.

Vì vậy, tháng bạn đặt là tháng đầu tiên của năm sau.


0

Giúp cuộc sống của bạn trở nên dễ dàng khi làm việc với ngày tháng, dấu thời gian và thời lượng. Sử dụng HalDateTime từ

http://sourceforge.net/projects/haldatetime/?source=directory

Ví dụ: bạn chỉ có thể sử dụng nó để phân tích cú pháp đầu vào của mình như sau:

HalDateTime mydate = HalDateTime.valueOf( "25.12.1988" );
System.out.println( mydate );   // will print in ISO format: 1988-12-25

Bạn cũng có thể chỉ định các mẫu để phân tích cú pháp và in.


3
Có vẻ như bạn đang quảng cáo lớp thư viện của riêng mình? Điều đó có thể được phép, nhưng sẽ đẹp hơn nếu bạn đề cập nếu bạn là nhà phát triển chính của HalDateTime.
Ole VV

Tôi đã không tán thành. Tuy nhiên cuộc sống không bao giờ là dễ dàng với những cuộc hẹn hò. Thư viện của bạn sẽ không thay đổi sự thật đó.
kiltek

Tại sao lại phản đối? Thư viện của tôi có từ năm 2013. Tất cả các chức năng đều có sẵn trong java.time như được chỉ định trong JSR 310 mà cá nhân tôi thấy là một trong những API được thiết kế tốt nhất. Tôi hoàn toàn khuyên bạn nên sử dụng cái đó.
Hajo Lemcke,
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.