การสร้างวัตถุวันที่จาวาจากปีเดือนวัน


99
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());  

ผลลัพธ์คือ:

1988
พ. 25 ม.ค. 00:00:08 น. IST 1989

ฉันกำลังผ่านไป25 12 1988แต่ฉันเข้าใจ25 Jan 1989แล้ว ทำไม?


1
b ในรหัสคืออะไร?
MysteryGuy

คำตอบ:


113

เดือนเป็นศูนย์ในปฏิทิน ดังนั้น 12 จึงตีความว่าธันวาคม + 1 เดือน ใช้

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

5
นักออกแบบ IBM API, นักออกแบบ JavaScript API นอกเหนือจากนั้นคงไม่มีใคร โปรดทราบว่าตอนนี้ปฏิทินล้าสมัยโดย Java 8 java.time API ซึ่งทำสิ่งที่ถูกต้อง
JB Nizet

67

นั่นเป็นวิธีที่ฉันชอบก่อน Java 8:

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

ฉันจะบอกว่านี่เป็นแนวทางที่สะอาดกว่า:

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

4
สามารถระบุเดือนโดยใช้Calendarค่าคงที่เช่น Calendar.FEBRUARY.
Geekarist

1
ระวังเดือนที่ใช้จะมีเลขจากศูนย์ใน Java 7 ใช้ค่าคงที่เพื่อหลีกเลี่ยงปัญหา
jediz

จุดที่จะทำให้ - getTime()ทั้งสองทำให้ผลลัพธ์ที่แตกต่างเมื่อโทร การตั้งค่าข้อมูลในตัวสร้างจะให้เวลา ณ จุดเริ่มต้นของวันโดยที่แนวทางหลังใช้เวลาปัจจุบัน ดูเอกสาร ดังนั้นวิธีแรกน่าจะเป็นแนวทางที่ดีกว่าโดยสมมติว่าผู้คนกำลังพยายามทำอะไรอยู่
funct7

28

java.time

ใช้java.timeเฟรมเวิร์กที่สร้างขึ้นใน 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

หากคุณต้องการข้อมูลเกี่ยวกับเวลา (ชั่วโมงนาทีวินาที) ให้ใช้การแปลงจากLocalDateเป็นLocalDateTime

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

คำตอบที่ดี แต่ระบุเขตเวลาหากทราบ A LocalDateไม่มีเขตเวลาดังนั้นจึงไม่แสดงช่วงเวลาที่แน่นอนบนไทม์ไลน์ หากบริบทของคุณระบุเขตเวลาให้ใช้เพื่อรับZonedDateTimeวัตถุ: LocalDate.parse("2015-12-22").atStartOfDay( ZoneId.of( "America/Montreal" ) )
Basil Bourque

9

การแสดงปฏิทินของ Java ไม่ใช่สิ่งที่ดีที่สุดพวกเขากำลังดำเนินการกับ Java 8 ฉันขอแนะนำให้คุณใช้Joda Timeหรือไลบรารีอื่นที่คล้ายกัน

นี่คือตัวอย่างสั้น ๆ โดยใช้ LocalDate จากไลบรารี Joda Time:

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

ที่นี่คุณสามารถทำตามกวดวิชาเริ่มต้นอย่างรวดเร็ว


6

ดูJavaDoc :

เดือน - ค่าที่ใช้ในการตั้งค่าช่องปฏิทิน MONTH ค่าเดือนเป็น 0 เช่น 0 สำหรับเดือนมกราคม

ดังนั้นเดือนที่คุณตั้งไว้คือเดือนแรกของปีถัดไป


0

ทำให้ชีวิตของคุณง่ายขึ้นเมื่อทำงานกับวันที่ประทับเวลาและระยะเวลา ใช้ HalDateTime จาก

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

ตัวอย่างเช่นคุณสามารถใช้เพื่อแยกวิเคราะห์ข้อมูลที่คุณป้อนได้ดังนี้:

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

คุณยังสามารถระบุรูปแบบสำหรับการแยกวิเคราะห์และการพิมพ์


3
ดูเหมือนว่าคุณกำลังโปรโมตคลาสห้องสมุดของคุณเองใช่ไหม ที่อาจได้รับอนุญาต HalDateTimeแต่มันจะดูดีกว่าถ้าคุณพูดถึงถ้าคุณเป็นนักพัฒนาหลักของ
Ole VV

ฉันไม่ได้ลงคะแนน อย่างไรก็ตามชีวิตไม่เคยง่ายกับวันที่ ห้องสมุดของคุณจะไม่เปลี่ยนแปลงข้อเท็จจริงนั้น
kiltek

ทำไมต้องโหวตลง? ห้องสมุดของฉันมีอายุตั้งแต่ปี 2013 ฟังก์ชันทั้งหมดพร้อมใช้งานใน java.time ตามที่ระบุใน JSR 310 ซึ่งฉันพบว่าเป็นหนึ่งใน API ที่ออกแบบมาดีที่สุด ฉันแนะนำให้ใช้อย่างเต็มที่
Hajo Lemcke
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.