Java Date กับปฏิทิน


364

มีคนได้โปรดแนะนำ "แนวปฏิบัติที่ดีที่สุด" ในปัจจุบันDateและCalendarประเภท

เมื่อมีการเขียนรหัสใหม่ที่ดีที่สุดคือเคยโปรดปรานCalendarมากกว่าDateหรือมีกรณีที่Dateเป็นประเภทข้อมูลที่เหมาะสมมากขึ้น?



2
FYI, ลำบากเก่าชั้นเรียนวันที่เวลาเช่นjava.util.Date, java.util.Calendarและjava.text.SimpleDateFormatตอนนี้มรดกแทนที่ด้วยjava.timeชั้นเรียน มากjava.timeการทำงานจะกลับรังเพลิง Java 6 & Java 7 ในThreeTen-ย้ายกลับโครงการ ดัดแปลงเพิ่มเติมสำหรับ Android รุ่นก่อนหน้าในโครงการThreeTenABP ดูวิธีการใช้ ThreeTenABP … .
Basil Bourque

2
FYI, โครงการJoda-Time (กล่าวถึงในความคิดเห็นอื่น) ขณะนี้อยู่ในโหมดการบำรุงรักษาโดยทีมงานให้คำแนะนำการย้ายถิ่นไปยังคลาสjava.time ดูการสอนโดยออราเคิล
Basil Bourque

คำตอบ:


377

Date เป็นคลาสที่ง่ายกว่าและส่วนใหญ่มีไว้เพื่อเหตุผลด้านความเข้ากันได้แบบย้อนหลัง หากคุณจำเป็นต้องตั้งค่าวันที่หรือทำเลขคณิตวันที่ให้ใช้ปฏิทิน ปฏิทินยังรองรับการโลคัลไลเซชัน ฟังก์ชันการจัดการวันที่ก่อนหน้าของ Date ได้ถูกคัดค้าน

โดยส่วนตัวแล้วฉันมักจะใช้เวลาเป็นมิลลิวินาที (หรือยาวตามความเหมาะสม) หรือปฏิทินเมื่อมีตัวเลือก

ทั้งวันที่และปฏิทินไม่แน่นอนซึ่งมีแนวโน้มที่จะนำเสนอปัญหาเมื่อใช้ทั้งใน API


5
FYI, ลำบากชะมัดเก่าชั้นเรียนวันที่เวลาเช่นjava.util.Date, java.util.Calendarและjava.text.SimpleDateFormatตอนนี้มรดกแทนที่โดยjava.timeชั้นเรียนที่สร้างขึ้นใน Java 8 และต่อมา ดูการสอนโดยออราเคิล
Basil Bourque

67

วิธีที่ดีที่สุดสำหรับรหัสใหม่ (หากนโยบายของคุณอนุญาตให้ใช้รหัสบุคคลที่สาม) คือการใช้ ห้องสมุด Joda เวลา

ทั้งวันที่และปฏิทินมีปัญหาในการออกแบบมากมายซึ่งไม่ใช่วิธีแก้ปัญหาที่ดีสำหรับรหัสใหม่


7
ฉันสองข้อเสนอแนะเพื่อใช้เวลา joda ง่ายต่อการใช้และทำความเข้าใจและนำเสนอฟังก์ชันการทำงานที่คุณสามารถใช้งานได้อีกมากมาย
Jeroen van Bergen

30
สำหรับการอภิปรายว่าจะใช้ Joda Time หรือติดกับคลาส JDK มาตรฐานดูstackoverflow.com/questions/589870/…
Jonik

3
ฉันไม่รู้ว่าควรใช้ downvotes หรือไม่ แต่ไม่ตอบคำถาม อาจจะดีกว่าเป็นความคิดเห็น
IcedDante

7
เนื่องจากคำถามเกี่ยวกับการใช้วันที่และปฏิทินที่ไม่ได้ใช้ห้องสมุดบุคคลที่สามซึ่งเพิ่มความเสี่ยงต่อการพึ่งพาผู้ขายรายเดียวให้กับโครงการ
อาร์คิมีดีสทราโนโน่

3
นี่เป็น "วิธีที่ดีที่สุด" จนกว่าจะมีแพ็คเกจ java.timeพร้อมใช้งานกับ Java 8
DaBlick

58
  • DateและCalendarเป็นแนวคิดพื้นฐานเดียวกันจริง ๆ (ทั้งสองเป็นตัวแทนของทันทีในเวลาและล้อมรอบlongค่าพื้นฐาน)

  • หนึ่งอาจโต้แย้งว่าCalendarจริง ๆ แล้วเสียยิ่งกว่าDateนั้นดูเหมือนว่าจะให้ข้อเท็จจริงที่เป็นรูปธรรมเกี่ยวกับสิ่งต่าง ๆ เช่นวันในสัปดาห์และเวลาของวันในขณะที่ถ้าคุณเปลี่ยนtimeZoneคุณสมบัติของคอนกรีตคอนกรีตกลายเป็น blancmange! วัตถุทั้งสองไม่มีประโยชน์อย่างแท้จริงในการจัดเก็บของปีเดือนวันหรือช่วงเวลาของวันด้วยเหตุผลนี้

  • ใช้Calendarเป็นเครื่องคิดเลขเท่านั้นเมื่อได้รับDateและTimeZoneวัตถุจะทำการคำนวณสำหรับคุณ หลีกเลี่ยงการใช้คุณสมบัติการพิมพ์ในแอปพลิเคชัน

  • ใช้SimpleDateFormatร่วมกับTimeZoneและDateเพื่อสร้าง Display Strings

  • หากคุณรู้สึกว่าใช้ Joda-Time ผจญภัยถึงแม้ว่ามันจะซับซ้อนโดยไม่จำเป็น IMHO และเร็ว ๆ นี้จะถูกแทนที่ด้วย API วันที่ JSR-310 ในทุกกรณี

  • ฉันตอบไปแล้วว่าการม้วนYearMonthDayชั้นเรียนของคุณเองนั้นไม่ยากที่จะใช้Calendarในการคำนวณวันที่ ฉันถูกลดระดับลงสำหรับข้อเสนอแนะ แต่ฉันก็ยังเชื่อว่าเป็นสิ่งที่ถูกต้องเพราะJoda-Time (และJSR-310 ) นั้นซับซ้อนเกินไปสำหรับกรณีการใช้งานส่วนใหญ่


1
มีกรอบเวลาสำหรับ JSR310 หรือไม่? มันจะเป็นใน Java 7 แต่ฉันเชื่อว่าตอนนี้ไม่เป็นเช่นนั้น
Brian Agnew

@Brian - มันเงียบไปมากในรายชื่อผู้รับจดหมายนั้น!
oxbow_lakes

เพียงแค่การตรวจสอบมันหายไปไม่ได้ใช้งานซึ่งหมายความว่าพวกเขาได้ไม่ได้เผยแพร่ร่างขั้นใน 18 เดือน :-(
ไบรอัน Agnew

ความคิดเห็นล่าสุดบนรายชื่อที่ส่งมาจากเดือนกรกฎาคมและโดยสตีเฟ่นดังนั้นโครงการนี้อาจจะยังคงฟ้องออกไป
oxbow_lakes

ตกลง หากคุณรู้วิธีใช้ Date อย่างปลอดภัยในฐานะวัตถุที่ไม่เปลี่ยนรูปและปฏิทินเพื่อจัดการวันที่คนส่วนใหญ่ควรจะปลอดภัย ระวังเมื่อใช้ SimpleDateFormat ในรหัสแบบมัลติเธรด
cwash

25

วันที่ดีที่สุดสำหรับการจัดเก็บวัตถุวันที่ มันเป็นหนึ่งยืนยันว่าเป็นหนึ่งในอนุกรม ...

ปฏิทินดีที่สุดสำหรับจัดการวันที่

หมายเหตุ: บางครั้งเราชอบ java.lang.Long over Date เนื่องจาก Date ไม่แน่นอนและไม่ปลอดภัยสำหรับเธรด บนวัตถุวันที่ให้ใช้ setTime () และ getTime () เพื่อสลับระหว่างสองคน ตัวอย่างเช่นวันที่คงที่ในแอปพลิเคชัน (ตัวอย่าง: ศูนย์ 1970/01/01 หรือการสมัคร END_OF_TIME ที่คุณตั้งไว้ที่ 2099/12/31 ซึ่งมีประโยชน์มากในการแทนที่ค่า Null เป็นเวลาเริ่มต้นและเวลาสิ้นสุดโดยเฉพาะ เมื่อคุณยังคงอยู่ในฐานข้อมูลเนื่องจาก SQL มีลักษณะแปลก ๆ ที่มีค่า Null)


ฉันคิดว่าคุณกำลังทำเรื่องเกี่ยวกับการเปลี่ยนรูปแบบไม่ได้java.lang.Long
pjp

17

ฉันมักจะใช้วันที่ถ้าเป็นไปได้ แม้ว่ามันจะไม่แน่นอน mutators จะเลิกใช้จริง ในท้ายที่สุดแล้วมันจะล้อมรอบยาวที่จะแสดงวันที่ / เวลา ในทางกลับกันฉันจะใช้ปฏิทินหากฉันต้องจัดการค่าต่างๆ

คุณสามารถคิดได้ด้วยวิธีนี้: คุณใช้ StringBuffer เฉพาะเมื่อคุณจำเป็นต้องมี Strings ที่คุณสามารถจัดการได้อย่างง่ายดายแล้วแปลงเป็น Strings โดยใช้เมธอด toString () ในทำนองเดียวกันฉันจะใช้ปฏิทินก็ต่อเมื่อฉันต้องการจัดการกับข้อมูลทางโลก

สำหรับการปฏิบัติที่ดีที่สุดของผมมักจะใช้วัตถุที่ไม่เปลี่ยนรูปมากที่สุดเท่าที่เป็นไปได้ด้านนอกของรูปแบบโดเมน มันช่วยลดโอกาสของผลข้างเคียงใด ๆ ได้อย่างมีนัยสำคัญและจะทำเพื่อคุณโดยคอมไพเลอร์มากกว่าการทดสอบ JUnit คุณใช้เทคนิคนี้โดยการสร้างขั้นสุดท้ายส่วนตัวฟิลด์ในชั้นเรียนของคุณ

และกลับมาที่การเปรียบเทียบ StringBuffer นี่คือรหัสบางส่วนที่แสดงวิธีการแปลงระหว่างปฏิทินและวันที่

String s = "someString"; // immutable string
StringBuffer buf = new StringBuffer(s); // mutable "string" via StringBuffer
buf.append("x");
assertEquals("someStringx", buf.toString()); // convert to immutable String

// immutable date with hard coded format.  If you are hard
// coding the format, best practice is to hard code the locale
// of the format string, otherwise people in some parts of Europe
// are going to be mad at you.
Date date =     new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH).parse("2001-01-02");

// Convert Date to a Calendar
Calendar cal = Calendar.getInstance();
cal.setTime(date);

// mutate the value
cal.add(Calendar.YEAR, 1);

// convert back to Date
Date newDate = cal.getTime();

// 
assertEquals(new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH).parse("2002-01-02"), newDate);

ใช่วัตถุที่เปลี่ยนไม่ได้ทำให้รู้สึกถึงการทำงานวันที่ java.timeชั้นเรียนที่แทนที่Date/ Calendarใช้รูปแบบวัตถุที่ไม่เปลี่ยนรูป
Basil Bourque

อาจเป็นจริง แต่ไม่ใช่ในปี 2010
Archimedes Trajano

ใช่. แต่ตอนนี้มีคนหลายพันคนที่อ่านหน้านี้มากกว่า 150,000 คน ความคิดเห็นของฉันคือหมายเหตุสำหรับพวกเขาไม่ใช่คำวิจารณ์ของคุณ
Basil Bourque

ฉันรู้ว่านั่นเป็นเหตุผลที่ฉัน upvote คำตอบอื่น ๆ อย่างไรก็ตามยังมีบางคนที่ต้องทนทุกข์ทรมานกับ JDK รุ่นเก่าที่ต้องการคำตอบข้างต้นด้วย
อาร์คิมีดีสทราโนโน

1
ที่จริงสำหรับ Java 6 & 7 เรามีThreeTen-ย้ายกลับโครงการ สิ่งนี้ทำให้การใช้งานจาวามากที่สุดด้วย API เดียวกัน ดังนั้นจึงไม่จำเป็นต้องใช้คลาสวันเวลาดั้งเดิมที่แย่มาก
Basil Bourque

15

Dates ควรใช้เป็นจุดเปลี่ยนไม่ได้ในเวลา; Calendars สามารถเปลี่ยนแปลงได้และสามารถส่งผ่านและแก้ไขได้หากคุณต้องการทำงานร่วมกับชั้นเรียนอื่นเพื่อให้ได้วันสุดท้าย พิจารณาพวกเขาคล้ายคลึงกับStringและStringBuilderคุณจะเข้าใจว่าฉันควรนำไปใช้อย่างไร

(และใช่ฉันรู้ว่าวันที่ไม่จริงไม่เปลี่ยนรูปทางเทคนิค แต่ความตั้งใจก็คือว่ามันไม่ควรจะกลายเป็นไม่ได้และถ้าไม่มีอะไรเรียกวิธีการคัดค้านก็เป็นเช่นนั้น.)


ใช่วัตถุที่เปลี่ยนไม่ได้ทำให้รู้สึกถึงการทำงานวันที่ java.timeชั้นเรียนที่แทนที่Date/ Calendarใช้รูปแบบวัตถุที่ไม่เปลี่ยนรูป โดยเฉพาะInstantแทนที่java.util.DateและZonedDateTimeแทนที่/Calendar GregorianCalendar
Basil Bourque

15

TL; DR

แนะนำ "แนวทางปฏิบัติที่ดีที่สุด" ในปัจจุบันไปรอบ ๆDateและCalendar

มันเป็นการดีที่สุดที่จะชอบCalendarมากกว่าเสมอDate

หลีกเลี่ยงชั้นเรียนดั้งเดิมเหล่านี้โดยสิ้นเชิง ใช้คลาสjava.timeแทน

  • สักครู่ในUTCให้ใช้(เทียบเท่าที่ทันสมัยของInstant
    Date )
  • สำหรับช่วงเวลาในเขตเวลาที่เฉพาะเจาะจงใช้(เทียบเท่าสมัยใหม่)ZonedDateTime
    GregorianCalendar
  • สำหรับช่วงเวลาหนึ่งในการชดเชยจาก UTCให้ใช้OffsetDateTime
    (ไม่เทียบเท่าในคลาสดั้งเดิม)
  • สำหรับวันที่ - เวลา (ไม่สักครู่) กับเขตเวลาที่ไม่รู้จักหรือออฟเซ็ตให้ใช้(ไม่เทียบเท่าในคลาสดั้งเดิม)LocalDateTime

ตารางประเภทวันที่และเวลาใน Java ทั้งทันสมัยและดั้งเดิม

รายละเอียด

คำตอบโดย Ortomala Lokni เป็นสิทธิที่จะขอแนะนำให้ใช้ที่ทันสมัยjava.timeเรียนมากกว่าลำบากเก่าเรียนมรดกวันที่เวลา ( Date,Calendarฯลฯ ) แต่คำตอบนั้นแสดงให้เห็นว่าคลาสผิดปกติเทียบเท่า (ดูความคิดเห็นของฉันในคำตอบนั้น)

ใช้ java.time

คลาส java.time มีการปรับปรุงมากมายในคลาสวันที่และเวลาเดิม คลาสเก่านั้นได้รับการออกแบบไม่ดีสับสนและลำบาก คุณควรหลีกเลี่ยงคลาสเก่าเมื่อเป็นไปได้ แต่เมื่อคุณต้องการแปลงเป็น / จากเก่า / ใหม่คุณสามารถทำได้โดยการเรียกวิธีการใหม่เพิ่มไปยังเก่าคลาส

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการแปลงดูคำตอบและไดอะแกรมที่ดีของฉันกับคำถามอื่นแปลง java.util.Date เป็นประเภท“ java.time” ชนิดใด.

การค้นหา Stack Overflow ให้ตัวอย่างคำถามและคำตอบจำนวนมากเกี่ยวกับการใช้ java.time แต่นี่เป็นบทสรุปอย่างรวดเร็ว

Instant

Instantได้รับในขณะปัจจุบันที่มี Instantชั้นหมายถึงช่วงเวลาบนไทม์ไลน์ในส่วนUTCมีความละเอียดของนาโนวินาที (ถึงเก้า (9) ตัวเลขของส่วนทศนิยม)

Instant instant = Instant.now();

ZonedDateTime

เพื่อดูว่า ช่วงเวลาที่พร้อมกันเดียวกันผ่านเลนส์ของบางภูมิภาคโดยเฉพาะอย่างยิ่งในเวลาที่ผนังนาฬิกาใช้โซนเวลา ( ZoneId) ZonedDateTimeเพื่อให้ได้

เขตเวลา

ระบุชื่อโซนเวลาที่เหมาะสมในรูปแบบของcontinent/regionเช่นAmerica/Montreal,Africa/CasablancaPacific/Aucklandหรือ อย่าใช้ตัวย่อ 3-4 ตัวอักษรเช่นESTหรือISTเพราะไม่ใช่เขตเวลาจริงไม่ใช่แบบมาตรฐานและไม่ซ้ำกัน (!)

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone();

สาขา

โซนเวลาเป็นประวัติศาสตร์ของภูมิภาคของการเปลี่ยนแปลงในของมันชดเชยจาก UTC แต่บางครั้งคุณได้รับการชดเชยโดยไม่มีโซนเต็ม ในกรณีนั้นให้ใช้OffsetDateTimeคลาส

ZoneOffset offset = ZoneOffset.parse( "+05:30" );
OffsetDateTime odt = instant.atOffset( offset );

การใช้เขตเวลานั้นดีกว่าการใช้ออฟเซ็ตเพียงอย่างเดียว

LocalDateTime

"ท้องถิ่น" ใน Local…ชั้นเรียนหมายถึงท้องที่ใด ๆไม่ใช่เฉพาะท้องที่ ดังนั้นชื่อสามารถตอบโต้ได้ง่าย

LocalDateTime, LocalDateและLocalTimeไม่มีข้อมูลเกี่ยวกับออฟเซ็ตหรือเขตเวลาอย่างจงใจ ดังนั้นพวกเขาจึงไม่ได้เป็นตัวแทนช่วงเวลาที่แท้จริงพวกเขาเป็นไม่ได้จุดบนไทม์ไลน์ หากมีข้อสงสัยหรือในความสับสนให้ใช้มากกว่าZonedDateTime LocalDateTimeค้นหา Stack Overflow เพื่อการสนทนาที่มากขึ้น

เงื่อนไข

อย่า conflate วัตถุวันที่เวลากับสตริงที่แสดงค่าของพวกเขา คุณสามารถแยกสตริงเพื่อรับวัตถุวันที่และคุณสามารถสร้างสตริงจากวัตถุวันที่ แต่สตริงจะไม่เป็นวันที่และเวลา

เรียนรู้เกี่ยวกับรูปแบบISO 8601 มาตรฐานที่ใช้โดยค่าเริ่มต้นในคลาส java.time


เกี่ยวกับ java.time

java.timeกรอบถูกสร้างขึ้นใน Java 8 และต่อมา ชั้นเรียนเหล่านี้แย่งลำบากเก่ามรดกเรียนวันที่เวลาเช่นjava.util.Date, CalendarและSimpleDateFormatและ

Joda เวลาโครงการขณะนี้อยู่ในโหมดการบำรุงรักษาให้คำแนะนำแก่การโยกย้ายไปยังjava.timeชั้นเรียน

ต้องการเรียนรู้เพิ่มเติมโปรดดูที่ออราเคิลกวดวิชา และค้นหา Stack Overflow สำหรับตัวอย่างและคำอธิบายมากมาย สเปคคือJSR 310310

การใช้ไดรเวอร์ JDBCเป็นไปตามมาตรฐานJDBC 4.2หรือใหม่กว่าคุณสามารถแลกเปลี่ยนjava.time ได้อบเจ็กต์โดยตรงกับฐานข้อมูลของคุณ ไม่จำเป็นต้องใช้สตริงหรือคลาส java.sql. *

จะรับคลาส java.time ได้ที่ไหน?

  • Java SE 8 , Java SE 9และใหม่กว่า
    • Built-in
    • เป็นส่วนหนึ่งของ Java API มาตรฐานที่มีการใช้งานแบบรวม
    • Java 9 เพิ่มคุณสมบัติและการแก้ไขเล็กน้อย
  • Java SE 6และ Java SE 7
    • มากของการทำงาน java.time จะกลับรังเพลิง Java 6 และ 7 ในThreeTen-ย้ายกลับ
  • Android
    • การใช้งานชุดบันเดิล Android รุ่นต่อมาของคลาส java.time
    • สำหรับก่อนหน้านี้ของ Android ที่ThreeTenABPโครงการปรับThreeTen-ย้ายกลับ (ดังกล่าวข้างต้น) ดูวิธีการใช้ ThreeTenABP … .

ตารางที่ไลบรารี java.time ใดที่จะใช้กับเวอร์ชันของ Java หรือ Android

โครงการThreeTen-Extraขยาย java.time ด้วยคลาสเพิ่มเติม โครงการนี้เป็นพื้นฐานที่พิสูจน์ได้สำหรับการเพิ่มเติมในอนาคตไปยัง java.time คุณอาจพบว่าการเรียนที่มีประโยชน์บางอย่างที่นี่เช่นInterval, YearWeek, YearQuarterและอื่น ๆ อีกมากมาย


10

ด้วย Java 8, แพ็คเกจ java.timeใหม่ควรใช้

วัตถุจะไม่เปลี่ยนรูปแบบ, เขตเวลาและการประหยัดแสงกลางวันถูกนำมาพิจารณา

คุณสามารถสร้างZonedDateTimeวัตถุจากjava.util.Dateวัตถุเก่าเช่นนี้

    Date date = new Date();
    ZonedDateTime zonedDateTime = date.toInstant().atZone(ZoneId.systemDefault());

ดีที่จะแนะนำคลาส java.time LocalDateTimeแต่ที่ไม่ดีที่จะแนะนำ ชั้นนั้นจงใจสูญเสียข้อมูลใด ๆ เกี่ยวกับ offset-from-UTC และเขตเวลา ดังนั้นคลาสนั้นไม่เทียบเท่ากับDateUTC และCalendarมีเขตเวลาที่กำหนด ดูไดอะแกรมคำตอบและแผนภาพของฉันไปยังคำถามอื่นแปลง java.util.Date เป็นประเภท“ java.time” ชนิดใด .
Basil Bourque

9

ฉันสนับสนุนJoda-timeเสมอ นี่คือเหตุผล

  1. API นั้นสอดคล้องและเข้าใจง่าย ไม่เหมือนกับ java.util.Date/Calendar APIs
  2. มันไม่ประสบปัญหาเธรดซึ่งแตกต่างจากjava.text.SimpleDateFormatเป็นต้น (ฉันเคยเห็นปัญหาไคลเอนต์มากมายที่เกี่ยวข้องกับการไม่ทราบว่าการจัดรูปแบบวันที่ / เวลามาตรฐานไม่ปลอดภัยต่อเธรด)
  3. มันเป็นพื้นฐานของ API วันที่ / เวลาใหม่ของ Java ( JSR310ซึ่งมีกำหนดไว้สำหรับ Java 8 ดังนั้นคุณจะใช้ API ที่จะกลายเป็นแกน API ของ Java

แก้ไข: คลาสวันที่ / เวลาของ Java ที่เปิดตัวพร้อมกับ Java 8 ตอนนี้เป็นทางออกที่ต้องการหากคุณสามารถย้ายไปยัง Java 8


3
ครั้งสุดท้ายที่ฉันดู JODA และ JSR-310 ดูแตกต่างกันมากแม้ว่าทั้งคู่จะเขียนโดย Stephen Colebourne ที่กล่าวไว้ JODA จะแนะนำคุณเกี่ยวกับความซับซ้อนของปัญหาวันที่ที่ JSR-310 แก้ได้ด้วย
oxbow_lakes

2
เนื่องจากคำถามเกี่ยวกับการใช้วันที่และปฏิทินที่ไม่ได้ใช้ห้องสมุดบุคคลที่สามซึ่งเพิ่มความเสี่ยงต่อการพึ่งพาผู้ขายรายเดียวให้กับโครงการ
อาร์คิมีดีสทราโนโน่

2
ฉันรักษาแนวปฏิบัติที่ดีที่สุดคือไม่ใช้คลาสเหล่านั้น
Brian Agnew

3
เมื่อพิจารณาปัญหาที่เกิดขึ้นกับคลาส java.util.Date และปฏิทินการแนะนำ Joda-Time (หรือ JSR 310) ดูเหมือนเหมาะสมและรับผิดชอบต่อฉัน เราไม่ได้พูดถึงเรื่องของรสนิยมหรือสไตล์สุนทรียะ หากมีคนถามว่าพวกเขาควรใช้รถสีแดงหรือรถสีเงินและฉันรู้ว่ารถสีแดงมียางแบนและรถสีเงินมีหม้อน้ำที่ถูกจับฉันควรเลือกรถหรือฉันควรจะเรียกแท็กซี่ คำตอบสำหรับคำถามนั้นน่าจะเห็นได้ชัดทุกวันนี้เพราะแม้แต่ Sun / Oracle ก็ตัดสินใจทิ้งอีเมลขยะเหล่านั้นและซื้อรถใหม่: JSR 310: API วันที่และเวลา
Basil Bourque

1
FYI, โครงการJoda-Timeขณะนี้อยู่ในโหมดบำรุงรักษา , แนะนำการโยกย้ายไปยังคลาสjava.time ดูการสอนโดยออราเคิล
Basil Bourque

8

ปาร์ตี้ช้าไปหน่อย แต่ Java มี Date Time API ใหม่ใน JDK 8 คุณอาจต้องการอัพเกรด JDK ของคุณและใช้มาตรฐาน ไม่มีวันที่ / ปฏิทินยุ่งอีกต่อไปไม่มีขวดของบุคคลที่สามอีกต่อไป


1

วันที่ควรได้รับการพัฒนาใหม่ แทนที่จะเป็นตัวคั่นยาวควรเก็บฟิลด์ปีเดือนวันที่ชั่วโมงนาทีวินาทีที่สองเป็นฟิลด์แยก อาจเป็นการดีที่จะจัดเก็บปฏิทินและเขตเวลาที่วันนี้เชื่อมโยงด้วย

ในบทสนทนาตามธรรมชาติของเราหากตั้งค่าการนัดหมายในวันที่ 1 พ.ย. 2556 เวลา 13.00 น. ของ NY นี่คือ DateTime มันไม่ใช่ปฏิทิน ดังนั้นเราควรจะสามารถสนทนาเช่นนี้ใน Java เช่นกัน

เมื่อวันที่จะถูกเก็บไว้เป็นจำนวนเต็มยาว (ของ mili วินาทีตั้งแต่ 1 มกราคม 1970 หรือบางสิ่งบางอย่าง) การคำนวณวันที่ปัจจุบันขึ้นอยู่กับปฏิทิน ปฏิทินที่แตกต่างกันจะให้วันที่แตกต่างกัน นี่เป็นโอกาสที่จะให้เวลาแน่นอน (เช่น 1 ล้านล้านวินาทีหลังจากบิ๊กแบง) แต่บ่อยครั้งที่เราต้องการวิธีการสนทนาที่สะดวกสบายเช่นวัตถุห่อหุ้มปีเดือน ฯลฯ

ฉันสงสัยว่ามีความก้าวหน้าใหม่ใน Java ที่จะกระทบยอดวัตถุประสงค์ 2 ข้อนี้หรือไม่ บางทีความรู้เกี่ยวกับจาวาของฉันก็เก่าเกินไป


ความจริงที่ว่าคุณสามารถจัดเก็บอินสแตนซ์ในเวลาเดียวกัน แต่รายงานชั่วโมง / นาที / วัน / สัปดาห์ / ปี / foo ที่แตกต่างกันตามระบบปฏิทินที่แตกต่างกันเป็นจุดแข็งไม่ใช่จุดอ่อน มันสะท้อนความเป็นจริง (ซับซ้อน)
ThrawnCA

แท้จริงแล้วDateได้รับการพัฒนาขึ้นใหม่ แทนที่ด้วยjava.time.Instantชั้นเรียน และCalendar/ GregorianCalendarก็ถูกแทนที่ด้วยjava.time.ZonedDateTimeชั้นเรียน
Basil Bourque

0

Btw "date" มักจะติดแท็กเป็น "ล้าสมัย / เลิกใช้" (ฉันไม่รู้ว่าทำไม) - มีบางอย่างเกี่ยวกับมันเขียนไว้ที่นั่น Java: ทำไมตัวสร้าง Date เลิกใช้แล้วและฉันจะใช้อะไรแทน

ดูเหมือนว่ามันเป็นปัญหาของนวกรรมิกทางเดียวผ่านวันที่ใหม่ (ปี int, เดือน int, วัน int)วิธีที่แนะนำคือผ่านทางปฏิทินและตั้งค่าพารามิเตอร์แยกต่างหาก .. ( ปฏิทิน cal = Calendar.getInstance (); )


0

ฉันใช้ปฏิทินเมื่อฉันต้องการการดำเนินการเฉพาะอย่างเช่นวันที่และเวลา แต่ฉันพบว่ามันมีประโยชน์เมื่อคุณต้องการจัดรูปแบบวันที่เพื่อปรับความต้องการของคุณเมื่อเร็ว ๆ นี้ฉันค้นพบว่า Locale มีการดำเนินการและวิธีการที่มีประโยชน์มากมาย ฉันกำลังใช้ Locale อยู่ตอนนี้!


FYI, ปัญหาCalendar& Dateคลาสถูกแทนที่เมื่อหลายปีก่อนโดยคลาสjava.time ไม่จำเป็นต้องใช้ที่เคยหรือDate CalendarและLocaleไม่มีส่วนเกี่ยวข้องกับความหมายของวัตถุวันเวลา A Localeใช้เพื่อระบุภาษามนุษย์และบรรทัดฐานทางวัฒนธรรมที่จะใช้ในการโลคัลไลซ์เซชันขณะสร้างข้อความเพื่อแสดงค่าของวัตถุวันที่
Basil Bourque
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.