อะไรคือความแตกต่างระหว่างค้นหาทันใจกับ LocalDateTime


256

ฉันรู้แล้ว:

  • การค้นหาทันใจเป็นเพียงการประทับเวลา "ทางเทคนิค" (นาโนวินาที) สำหรับการคำนวณ
  • LocalDateTimeค่อนข้างแสดงวันที่ / นาฬิการวมถึงเขตเวลาสำหรับมนุษย์

ยังคงอยู่ในตอนท้าย IMO ทั้งสองสามารถใช้เป็นประเภทสำหรับกรณีการใช้งานส่วนใหญ่ ตัวอย่าง: ปัจจุบันฉันกำลังทำงานแบทช์ที่ฉันต้องการคำนวณการวิ่งครั้งต่อไปตามวันที่และฉันพยายามหาข้อดี / ข้อเสียระหว่างสองประเภทนี้ (นอกเหนือจากข้อได้เปรียบความแม่นยำระดับนาโนวินาทีของ Instant และส่วนของโซนเวลา ของ LocalDateTime)

คุณสามารถตั้งชื่อตัวอย่างแอพพลิเคชั่นได้หรือไม่โดยควรใช้เฉพาะ Instant หรือ LocalDateTime

แก้ไข: ระวังเอกสารที่อ่านผิดสำหรับ LocalDateTime เกี่ยวกับความแม่นยำและโซนเวลา


การค้นหาทันใจเป็นเรื่องพื้นฐานมากขึ้นการห่อตัวมาตรฐานให้ยาวสำหรับ UTC สำหรับ cron เช่นแบทช์ไม่เป็นทางเลือกที่สมเหตุสมผล
Joop Eggen

37
คำจำกัดความไม่ถูกต้อง LocalDateTimeไม่ได้มีโซนเวลา!
Basil Bourque

คำตอบ:


834

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

TL; DR

InstantและLocalDateTimeเป็นสัตว์สองชนิดที่ต่างกันโดยสิ้นเชิง: ตัวหนึ่งแสดงถึงช่วงเวลาหนึ่งช่วงเวลาอื่น ๆ ไม่ได้

  • Instant แสดงถึงช่วงเวลาหนึ่งซึ่งเป็นจุดเฉพาะในไทม์ไลน์
  • LocalDateTimeแสดงถึงวันที่และเวลาของวัน แต่ไม่มีเขตเวลาหรือออฟเซ็ตจาก UTC ชั้นนี้ไม่สามารถแสดงได้ในขณะนี้ มันแสดงถึงช่วงเวลาที่อาจเกิดขึ้นตามช่วงเวลาประมาณ 26-27 ชั่วโมงซึ่งเป็นช่วงของเขตเวลาทั้งหมดทั่วโลก

ข้อสันนิษฐานที่ไม่ถูกต้อง

LocalDateTime ค่อนข้างเป็นตัวแทนวันที่ / นาฬิการวมถึงเขตเวลาสำหรับมนุษย์

คำสั่งของคุณไม่ถูกต้อง: มีไม่มีโซนเวลา ไม่มีโซนเวลาเป็นจุดรวมของคลาสนั้นLocalDateTime

ในการอ้างอิงเอกสารของชั้นเรียน:

คลาสนี้ไม่ได้จัดเก็บหรือเป็นตัวแทนของเขตเวลา แต่มันเป็นคำอธิบายของวันที่ที่ใช้สำหรับวันเกิดรวมกับเวลาท้องถิ่นตามที่เห็นบนนาฬิกาแขวน ไม่สามารถเป็นตัวแทนของทันเวลาบนเส้นเวลาโดยไม่มีข้อมูลเพิ่มเติมเช่นออฟเซ็ตหรือโซนเวลา

ดังนั้นLocal…หมายถึง“ ไม่กำหนดเขตไม่มีการชดเชย”

Instant

ป้อนคำอธิบายรูปภาพที่นี่

An Instantคือช่วงเวลาบนเส้นเวลาในUTCซึ่งนับเป็นนาโนวินาทีนับตั้งแต่ช่วงเวลาในช่วงเวลาแรกของปี 1970 UTC (โดยทั่วไปโปรดดูเอกสารรายละเอียดของ nitty-gritty) เนื่องจากตรรกะทางธุรกิจส่วนใหญ่ของคุณพื้นที่เก็บข้อมูลและการแลกเปลี่ยนข้อมูลควรอยู่ใน UTC นี่เป็นคลาสที่ใช้งานได้ง่าย

Instant instant = Instant.now() ;  // Capture the current moment in UTC.

OffsetDateTime

ป้อนคำอธิบายรูปภาพที่นี่

คลาสของOffsetDateTimeชั้นแสดงถึงช่วงเวลาเป็นวันที่และเวลาโดยมีบริบทเป็นจำนวนชั่วโมง - นาที - วินาทีก่อนเวลาหรือหลัง UTC จำนวนออฟเซ็ตจำนวนชั่วโมง - นาที - วินาทีแสดงโดยZoneOffsetคลาส

หากจำนวนชั่วโมง - นาที - วินาทีเป็นศูนย์จะOffsetDateTimeแสดงช่วงเวลาใน UTC เหมือนกับInstantเวลา

ZoneOffset

ป้อนคำอธิบายรูปภาพที่นี่

ZoneOffsetชั้นหมายถึงการชดเชยจากที่ UTCจำนวนชั่วโมงนาทีวินาทีข้างหน้าของ UTC หรือด้านหลัง UTC

A ZoneOffsetเป็นเพียงจำนวนชั่วโมงนาทีนาทีไม่มีอะไรเพิ่มเติม โซนนั้นมีมากขึ้นโดยมีชื่อและประวัติการเปลี่ยนแปลงเพื่อชดเชย ดังนั้นการใช้โซนจะดีกว่าการใช้ออฟเซ็ตเท่านั้น

ZoneId

ป้อนคำอธิบายรูปภาพที่นี่

โซนเวลาเป็นตัวแทนจากZoneIdระดับ

ยกตัวอย่างเช่นวันใหม่ในปารีสนั้นเร็วกว่าในมอนทรีออล ดังนั้นเราจำเป็นต้องขยับเข็มนาฬิกาเพื่อสะท้อนเวลาเที่ยง (เมื่อดวงอาทิตย์อยู่เหนือศีรษะโดยตรง) สำหรับภูมิภาคที่กำหนด ไกลออกไปทางทิศตะวันออก / ทิศตะวันตกจากเส้น UTC ในยุโรปตะวันตก / แอฟริกาที่มีขนาดใหญ่ชดเชย

เขตเวลาเป็นชุดของกฎสำหรับจัดการกับการปรับและความผิดปกติที่ชุมชนท้องถิ่นหรือภูมิภาคปฏิบัติ ที่พบมากที่สุดคือความผิดปกติบ้าทุกเกินไปนิยมที่รู้จักกันเป็นเวลาออมแสง (DST)

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

กฎเหล่านี้เปลี่ยนแปลงบ่อยกว่าที่คุณคาดหวัง ตรวจสอบให้แน่ใจว่าได้ปฏิบัติตามกฎของห้องสมุดวันที่ของคุณโดยปกติจะเป็นสำเนาของฐานข้อมูล 'tz' ซึ่งเป็นข้อมูลล่าสุด การรักษาขึ้นไปวันที่ง่ายกว่าที่เคยในขณะนี้ใน Java 8 กับ Oracle ปล่อยอัพเดตเครื่องมือเขตเวลา

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

เขตเวลา = ออฟเซ็ต + กฎการปรับค่า

ZoneId z = ZoneId.of( Africa/Tunis ) ; 

ZonedDateTime

ป้อนคำอธิบายรูปภาพที่นี่

คิดว่าZonedDateTimeแนวคิดเป็นกับที่ได้รับมอบหมายInstantZoneId

ZonedDateTime = (ทันที + โซนหมายเลข)

ในการจับภาพช่วงเวลาปัจจุบันตามที่เห็นในเวลานาฬิกาแขวนที่ผู้คนในภูมิภาคนั้นใช้ (เขตเวลา):

ZonedDateTime zdt = ZonedDateTime.now( z ) ;  // Pass a `ZoneId` object such as `ZoneId.of( "Europe/Paris" )`. 

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

ZonedDateTime zdt = instant.atZone( z ) ;
String output = zdt.toString() ;                 // Standard ISO 8601 format.

DateTimeFormatterคุณสามารถสร้างข้อความในรูปแบบที่มีการแปลโดยใช้

DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL ).withLocale( Locale.CANADA_FRENCH ) ; 
String outputFormatted = zdt.format( f ) ;

mardi 30 avril 2019 à 23 h 22 min 55 s heure de l'Inde

LocalDate, LocalTime,LocalDateTime

ไดอะแกรมแสดงเฉพาะปฏิทินสำหรับ <code> LocalDate </code>

ไดอะแกรมแสดงนาฬิกาสำหรับ <code> LocalTime </code>

ไดอะแกรมแสดงปฏิทินพร้อมนาฬิกาสำหรับ <code> LocalDateTime </code>

ว่า "ท้องถิ่น" เรียนวันเวลาLocalDateTime, LocalDate, LocalTimeเป็นชนิดที่แตกต่างกันของสัตว์ The ไม่ได้เชื่อมโยงกับท้องที่หรือเขตเวลาใดเขตหนึ่ง พวกเขาไม่ได้เชื่อมโยงกับไทม์ไลน์ พวกเขาไม่มีความหมายที่แท้จริงจนกว่าคุณจะนำไปใช้กับท้องที่เพื่อหาจุดบนเส้นเวลา

คำว่า "Local" ในชื่อชั้นเรียนเหล่านี้อาจตอบโต้ผู้ที่ไม่ได้ฝึกหัด คำนี้หมายถึงสถานที่ใด ๆหรือทุกท้องที่ แต่ไม่ใช่สถานที่เฉพาะ

ดังนั้นสำหรับแอปทางธุรกิจประเภท "ท้องถิ่น" จึงไม่ได้ใช้บ่อยเพราะเป็นเพียงแนวคิดทั่วไปของวันที่หรือเวลาที่เป็นไปได้ไม่ใช่ช่วงเวลาเฉพาะบนไทม์ไลน์ แอปทางธุรกิจมีแนวโน้มที่จะใส่ใจในช่วงเวลาที่ใบแจ้งหนี้มาถึงสินค้าที่จัดส่งสำหรับการขนส่งพนักงานถูกจ้างหรือแท็กซี่ออกจากโรงรถ ดังนั้นนักพัฒนาแอพพลิเคชั่นทางธุรกิจจึงใช้งานInstantและZonedDateTimeคลาสทั่วไป

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

ครั้งเดียวหลายช่วงเวลา

บางครั้งเราต้องการแสดงเวลาที่แน่นอนในวันที่กำหนด แต่ต้องการนำไปใช้กับหลาย ๆ เมืองในเขตเวลา

ยกตัวอย่างเช่น "คริสมาสต์เริ่มต้นที่เที่ยงคืนวันที่ 25 ธันวาคม 2015 ว่า" LocalDateTimeเป็น เที่ยงคืนนัดในช่วงเวลาที่แตกต่างกันในกรุงปารีสกว่าในมอนทรีออและที่แตกต่างกันอีกครั้งในซีแอตเติและในโอ๊คแลนด์

LocalDate ld = LocalDate.of( 2018 , Month.DECEMBER , 25 ) ;
LocalTime lt = LocalTime.MIN ;   // 00:00:00
LocalTime ldt = LocalDateTime.of( ld , lt ) ;  // Xmas morning anywhere. 

อีกตัวอย่างหนึ่ง "Acme บริษัท ฯ มีนโยบายที่จะเริ่มต้นเวลาอาหารกลางวันที่ 12:30 ในแต่ละโรงงานทั่วโลก" LocalTimeคือ เพื่อให้มีความหมายที่แท้จริงคุณต้องนำไปใช้กับเส้นเวลาเพื่อกำหนดช่วงเวลา 12:30 ที่โรงงานสตุตการ์ตหรือ 12:30 ที่โรงงานราบัตหรือ 12:30 ที่โรงงานซิดนีย์

นัดหมายจอง

อีกสถานการณ์ที่จะใช้LocalDateTimeสำหรับการจองกิจกรรมในอนาคต (เช่นการนัดหมายทันตแพทย์) การนัดหมายเหล่านี้อาจมีมากพอที่จะเกิดขึ้นในอนาคตซึ่งคุณอาจเสี่ยงต่อการกำหนดเขตเวลาใหม่ นักการเมืองมักจะเตือนล่วงหน้าเล็กน้อยหรือไม่มีการเตือนเลย หากคุณหมายถึง "15.00 น. ถัดไปวันที่ 23 มกราคม" โดยไม่คำนึงว่านักการเมืองจะเล่นอย่างไรกับนาฬิกาคุณจะไม่สามารถบันทึกช่วงเวลานั้นได้ซึ่งจะเห็นเวลา 15.00 น. กลายเป็น 14.00 น. หรือ 16.00 น. หากภูมิภาคนั้นรับรองหรือลดเวลาตามฤดูกาล ตัวอย่างเช่น.

สำหรับการนัดหมายให้จัดเก็บ a LocalDateTimeและ a ZoneIdแยกกัน ต่อมาเมื่อสร้างตารางเวลา on-the-fly จะกำหนดช่วงเวลาโดยการโทรLocalDateTime::atZone( ZoneId )เพื่อสร้างZonedDateTimeวัตถุ

ZonedDateTime zdt = ldt.atZone( z ) ;  // Given a date, a time-of-day, and a time zone, determine a moment, a point on the timeline.

หากจำเป็นคุณสามารถปรับเป็น UTC สารสกัดจากInstantZonedDateTime

Instant instant = zdt.toInstant() ;  // Adjust from some zone to UTC. Same moment, same point on the timeline, different wall-clock time.

เขตที่ไม่รู้จัก

บางคนอาจใช้LocalDateTimeในสถานการณ์ที่ไม่ทราบเขตเวลาหรือออฟเซ็ต

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

ประเภทวันที่และเวลา

เพื่อความสมบูรณ์นี่คือตารางประเภทวันที่และเวลาที่เป็นไปได้ทั้งหมดทั้งทันสมัยและดั้งเดิมใน Java เช่นเดียวกับที่กำหนดโดยมาตรฐาน SQL สิ่งนี้อาจช่วยวางInstant& LocalDateTimeคลาสในบริบทที่กว้างขึ้น

ตารางประเภทเวลาวันที่ทั้งหมดใน Java (ทั้งทันสมัยและดั้งเดิม) รวมถึงมาตรฐาน SQL

สังเกตเห็นทางเลือกแปลก ๆ ที่สร้างขึ้นโดยทีมงาน Java ในการออกแบบ JDBC 4.2 พวกเขาเลือกที่จะสนับสนุนเวลาjava.timeทั้งหมด ... ยกเว้นสองคลาสที่ใช้บ่อยที่สุด: Instant& ZonedDateTime.

แต่ไม่ต้องกังวล เราสามารถแปลงไปมาได้อย่างง่ายดาย

Instantแปลง

// Storing
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ;
myPreparedStatement.setObject(  , odt ) ;

// Retrieving
OffsetDateTime odt = myResultSet.getObject(  , OffsetDateTime.class ) ;
Instant instant = odt.toInstant() ;

ZonedDateTimeแปลง

// Storing
OffsetDateTime odt = zdt.toOffsetDateTime() ;
myPreparedStatement.setObject(  , odt ) ;

// Retrieving
OffsetDateTime odt = myResultSet.getObject(  , OffsetDateTime.class ) ;
ZoneId z = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime zdt = odt.atZone( z ) ; 

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

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

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

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

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

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

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

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

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


40
คำตอบที่ดี ฉันคิดว่าความสับสน (อย่างน้อยฉัน) มาจากการLocalตั้งชื่อ สัญชาตญาณของฉันสำหรับLocalวิธีการที่เกี่ยวข้องกับที่ฉันและเมื่อฉัน (?!) ซึ่งทำให้ฉันเชื่อว่าจริง ๆ แล้วมันจะเป็นสิ่งที่ZonedDateTimeเป็น
mkobit

4
ใช่มันสับสน นั่นคือเหตุผลที่ java.time เพิ่มคำว่า 'Zoned' ลงในDateTimeชื่อคลาสที่ใช้โดย Joda-Time รุ่นก่อน (การสร้างZonedDateTime) เพื่อเน้นความแตกต่างจากคลาส "Local" ลองนึกถึงชื่อ "ท้องถิ่น" ว่าเป็นการจดชวเลขสำหรับ "จำเป็นต้องใช้กับบางพื้นที่"
Basil Bourque

2
คำนำหน้าด้วยคำLocalอาจเป็นวิธีที่แตกต่างจากแพคเกจ java.util แต่อย่างใดฉันรู้สึกว่าอาจมีตัวเลือกคำที่ดีกว่า
vphilipnyc

2
@simonh ตรงกันข้าม ... เมื่อพนักงานใหม่ลงนามในเอกสารการจ้างงานของเขา / เธอกำหนดประโยชน์ของพวกเขารวมถึงการประกันชีวิตและจากนั้นขั้นตอนการจ้างใหม่นอกสำหรับกาแฟเท่านั้นที่จะได้รับการตีและฆ่าโดยรถบรรทุกจะมีหลายคนเช่น ในฐานะผู้จัดการฝ่ายทรัพยากรบุคคลตัวแทนประกันภัยและทนายความที่ต้องการทราบช่วงเวลาที่แน่นอนเมื่อการจ้างงานใหม่มีผล
Basil Bourque

2
@simonh ใช่มีหลายกรณีที่เวลาวันที่ "ท้องถิ่น" เหมาะสม นอกเหนือจากที่กล่าวไว้ในคำตอบของฉันแล้วกรณีทั่วไปอีกอย่างหนึ่งที่เกี่ยวกับธุรกิจก็คือการนัดหมายในอนาคตมากกว่าสองสามเดือนข้างหน้ามากพอที่นักการเมืองจะเปลี่ยนกฎโซนเวลาได้ นักการเมืองมักทำการเปลี่ยนแปลงเหล่านี้เช่นการเปลี่ยนวันที่เมื่อเปิด / ปิด Daylight Saving Time (DST) หรือการเปิด / ปิด DST อย่างถาวร
Basil Bourque

20

หนึ่งความแตกต่างที่สำคัญคือส่วนหนึ่งของLocal LocalDateTimeหากคุณอาศัยอยู่ในประเทศเยอรมนีและสร้างLocalDateTimeอินสแตนซ์และมีคนอื่นอาศัยอยู่ในสหรัฐอเมริกาและสร้างอินสแตนซ์อื่นในเวลาเดียวกัน (ให้ตั้งนาฬิกาอย่างถูกต้อง) - มูลค่าของวัตถุเหล่านั้นจะแตกต่างกัน สิ่งนี้ไม่ได้ใช้กับInstantซึ่งคำนวณโดยอิสระจากเขตเวลา

LocalDateTimeเก็บวันที่และเวลาโดยไม่มีเขตเวลา แต่ค่าเริ่มต้นขึ้นอยู่กับเขตเวลา Instantไม่ได้

นอกจากนี้ยังLocalDateTimeมีวิธีการจัดการองค์ประกอบวันที่เช่นวันชั่วโมงเดือน Instantไม่

นอกเหนือจากข้อได้เปรียบที่แม่นยำของนาโนวินาทีของการค้นหาทันใจและส่วนของเขตเวลาของ LocalDateTime

ทั้งสองคลาสมีความแม่นยำเหมือนกัน LocalDateTimeไม่เก็บเขตเวลา อ่าน javadocs อย่างทั่วถึงเพราะคุณอาจทำผิดพลาดใหญ่กับสมมติฐานที่ไม่ถูกต้องดังกล่าวทันทีและLocalDateTime


ขอโทษสำหรับการอ่านผิดส่วนในโซน + แม่นยำ ขออภัยที่ทำซ้ำจากการโพสต์ด้านบน: พิจารณาแอปพลิเคชันเขตเวลาเดียวในกรณีใช้งานใดบ้างที่คุณโปรดปราน LocalDateTime หรือในทางกลับกัน
manuel aldana

1
ฉันจะใช้ LocalDateTime ทุกครั้งที่ฉันต้องการวันที่และ / หรือเวลา ในชั่วโมงนาทีหรือมากกว่านั้น ฉันใช้ Instant เพื่อวัดเวลาการดำเนินการตัวอย่างหรือเก็บฟิลด์ภายในของ sth ที่เกิดขึ้นแล้วและที่นั่น กำลังคำนวณการวิ่งครั้งต่อไปเช่นเดียวกับในกรณีของคุณหรือไม่ LocalDateTime ดูเหมาะสม แต่เป็นความเห็น ตามที่คุณระบุทั้งสองสามารถใช้งานได้
Dariusz

คุณสามารถอธิบายรายละเอียดเพิ่มเติมเกี่ยวกับLocalDateTime stores date and time without timezone, but it's initial value is timezone dependent? ค่าเริ่มต้นคืออะไรและขึ้นอยู่กับเขตเวลาอย่างไร ขอบคุณ
สูงสุด

12

คุณผิดLocalDateTime: มันไม่ได้จัดเก็บข้อมูลเขตเวลาใด ๆ และมีความแม่นยำระดับนาโนวินาที การอ้าง Javadoc (การเน้นของฉัน):

วันที่และเวลาที่ไม่มีเขตเวลาในระบบปฏิทิน ISO-8601เช่น 2007-12-03T10: 15: 30

LocalDateTime เป็นออบเจ็กต์วันที่และเวลาที่ไม่เปลี่ยนรูปแบบซึ่งแสดงถึงวันที่และเวลาซึ่งมักถูกมองว่าเป็นปีเดือนเดือนวันชั่วโมงนาทีวินาที ฟิลด์วันที่และเวลาอื่น ๆ เช่นวันของปีวันของสัปดาห์และสัปดาห์ของปีก็สามารถเข้าถึงได้เช่นกัน เวลาจะเป็นตัวแทนของความแม่นยำ nanosecond ตัวอย่างเช่นค่า "2nd October 2007 เวลา 13: 45.30.123456789" สามารถเก็บไว้ใน LocalDateTime

ความแตกต่างระหว่างทั้งสองนั้นInstantแสดงถึงการชดเชยจาก Epoch (01-01-1970) และเป็นเช่นนี้แสดงถึงช่วงเวลาที่เฉพาะเจาะจงในเวลา Instantวัตถุสองชิ้นที่สร้างขึ้นในเวลาเดียวกันในสถานที่ต่าง ๆ ของโลกจะมีค่าเท่ากันทุกประการ


เมื่อพิจารณาถึงแอปพลิเคชันเขตเวลาเดียวคุณควรใช้ LocalDateTime หรือในทางกลับกันในกรณีใด
manuel aldana

3
@ manuelaldana มันเป็นเรื่องของรสนิยมมากกว่า ฉันต้องการ LocalDateTime สำหรับทุกสิ่งที่เกี่ยวข้องกับผู้ใช้ (วันเกิด ... ) และทันทีสำหรับทุกสิ่งที่เกี่ยวข้องกับเครื่อง (เวลาดำเนินการ ... )
Tunaki

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

@Tunaki การใช้คำว่า 'offset' ในย่อหน้าสุดท้ายเป็นการเบี่ยงเบนความสนใจ คำนั้นมีความหมายบางอย่างในงานวันเวลาดังนั้นการใช้ที่นี่ในบริบทนี้อาจไม่เป็นประโยชน์
Basil Bourque

0

Instant ตรงกับเวลาในช่วงเที่ยงวันสำคัญ (Greenwich)

โดยที่LocalDateTimeสัมพันธ์กับการตั้งค่าเขตเวลาของระบบปฏิบัติการและ

ไม่สามารถเป็นตัวแทนของการโต้ตอบแบบทันทีโดยไม่มีข้อมูลเพิ่มเติมเช่นออฟเซ็ตหรือเขตเวลา


2
ค้นหาทันใจใช้ UTC ไม่ใช่ GMT
Torsten Ojaperv
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.