TL; DR
LocalDateTime.parse( // Lacking an offset or time zone, parse as a `LocalDateTime`. *Not* a specific moment in time.
"2008-01-01 13:15:00".replace( " " , "T" ) // Alter input string to comply with ISO 8601 standard format.
)
.toLocalDate() // Extract a date-only value.
.atStartOfDay( // Do not assume the day starts at 00:00:00. Let class determine start-of-day.
ZoneId.of( "Europe/Paris" ) // Determining a specific start-of-day requires a time zone.
) // Result is a `ZonedDateTime` object. At this point we have a specific moment in time, a point on the timeline.
.toString() // Generate a String in standard ISO 8601 format, wisely extended to append the name of the time zone in square brackets.
2008-01-01T00: 00 + 01: 00 [ยุโรป / ปารีส]
ในการสร้าง String ในรูปแบบที่คุณต้องการให้ส่งไฟล์DateTimeFormatter
.
LocalDateTime.parse( // Lacking an offset or time zone, parse as a `LocalDateTime`. *Not* a specific moment in time.
"2008-01-01 13:15:00".replace( " " , "T" ) // Alter input string to comply with ISO 8601 standard format.
)
.toLocalDate() // Extract a date-only value.
.atStartOfDay( // Do not assume the day starts at 00:00:00. Let class determine start-of-day.
ZoneId.of( "Europe/Paris" ) // Determining a specific start-of-day requires a time zone.
) // Result is a `ZonedDateTime` object. At this point we have a specific moment in time, a point on the timeline.
.format( // Generate a String representing the object’s value.
DateTimeFormatter.ISO_LOCAL_DATE_TIME // Built-in predefined formatter close to what you want.
)
.replace( "T" , " " ) // Replace the standard’s use of a 'T' in the middle with your desired SPACE character.
2008-01-01 00:00:00 น
รายละเอียด
คำตอบอื่น ๆ ถูกต้อง แต่ใช้คลาสวันที่และเวลาแบบเก่าซึ่งตอนนี้เฟรมเวิร์ก java.time ล้าสมัย
java.time
กรอบ java.time ถูกสร้างขึ้นใน Java 8 และใหม่กว่า ฟังก์ชัน java.time ส่วนใหญ่แบ็คพอร์ตเป็น Java 6 & 7 ( ThreeTen-Backport ) และปรับให้เข้ากับ Android ( ThreeTenABP ) เพิ่มเติม
ขั้นแรกให้แก้ไขสตริงอินพุตเพื่อให้สอดคล้องกับรูปแบบ ISO 8601 เวอร์ชัน Canonical มาตรฐานISO 8601รูปแบบถูกนำมาใช้โดยเริ่มต้นในการเรียน java.time สำหรับการแยก / สร้างสตริงที่เป็นตัวแทนของค่าวันเวลา เราจำเป็นต้องแทนที่ SPACE ตรงกลางด้วยไฟล์T
.
String input = "2008-01-01 13:15:00".replace( " " , "T" ); // → 2008-01-01T13:15:00
ตอนนี้เราสามารถแยกวิเคราะห์เป็น a LocalDateTime
โดยที่“ Local” หมายถึงไม่มีเฉพาะท้องที่ ข้อมูลที่ป้อนไม่มีข้อมูลoffset-from-UTCหรือเขตเวลา
LocalDateTime ldt = LocalDateTime.parse( input );
ldt.toString () … 2008-01-01T13: 15: 00 น
หากคุณไม่สนใจเรื่องเวลาของวันหรือเขตเวลาให้แปลงเป็นLocalDate
ไฟล์.
LocalDate ld = ldt.toLocalDate();
ld.toString () … 2008-01-01
ช่วงเวลาแรกของวัน
หากคุณต้องการให้เวลาของวันตั้งเป็นช่วงเวลาแรกของวันให้ใช้ZonedDateTime
คลาสจากนั้นแปลงเป็นLocalDate
วัตถุเพื่อเรียกatStartOfDay
ใช้เมธอด โปรดทราบว่าช่วงเวลาแรกอาจไม่ใช่เวลา00:00:00
เนื่องจากเวลาออมแสงหรือความผิดปกติอื่น ๆ
เขตเวลามีความสำคัญเนื่องจากในช่วงเวลาใด ๆ วันที่จะแตกต่างกันไปทั่วโลกตามโซน ตัวอย่างเช่นช่วงเวลาหลังเที่ยงคืนในปารีสเป็นวันใหม่สำหรับชาวปารีส แต่ยังคงเป็น "เมื่อวาน" ในมอนทรีออลสำหรับชาวแคนาดา
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ldt.atZone( zoneId );
LocalDate ldFromZdt = zdt.toLocalDate();
ZonedDateTime zdtStartOfDay = ldFromZdt.atStartOfDay( zoneId );
zdtStartOfDay.toString () … 2008-01-01T00: 00: 00-05: 00 [อเมริกา / มอนทรีออล]
UTC
หากต้องการดูช่วงเวลานั้นผ่านเลนส์ของเขตเวลาUTCให้แยกInstant
วัตถุ ทั้งสองZonedDateTime
และInstant
จะแสดงช่วงเวลาเดียวกันบนไทม์ไลน์ แต่ปรากฏเป็นเวลานาฬิกาแขวนที่ต่างกันสองเวลาครั้งผนังนาฬิกา
An Instant
เป็นคลาส building-block พื้นฐานใน java.time เสมอใน UTC ตามความหมาย ใช้คลาสนี้บ่อยๆเนื่องจากโดยทั่วไปคุณควรใช้ตรรกะทางธุรกิจการจัดเก็บข้อมูลและการแลกเปลี่ยนข้อมูลใน UTC
Instant instant = zdtStartOfDay.toInstant();
instant.toString () … 2008-01-01T05: 00: 00Z
เราเห็นเวลา 5.00 น. แทนที่จะเป็นจังหวะของเที่ยงคืน ในรูปแบบมาตรฐานZ
ส่วนท้ายสั้นZulu
และหมายถึง "UTC"
เกี่ยวกับjava.time
java.timeกรอบถูกสร้างขึ้นใน Java 8 และต่อมา ชั้นเรียนเหล่านี้แย่งลำบากเก่ามรดกเรียนวันที่เวลาเช่นjava.util.Date
, และCalendar
SimpleDateFormat
โครงการJoda-Timeขณะนี้อยู่ในโหมดการบำรุงรักษาแนะนำให้ย้ายไปที่java.timeคลาส
ต้องการเรียนรู้เพิ่มเติมโปรดดูที่ออราเคิลกวดวิชา และค้นหา Stack Overflow สำหรับตัวอย่างและคำอธิบายมากมาย ข้อมูลจำเพาะคือJSR 310310
คุณสามารถแลกเปลี่ยนวัตถุjava.timeโดยตรงกับฐานข้อมูลของคุณ ใช้ไดรเวอร์ JDBC ที่สอดคล้องกับJDBC 4.2หรือใหม่กว่า ไม่ต้องใช้สายไม่จำเป็นต้องมี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 (<26) ที่ThreeTenABPโครงการปรับThreeTen-ย้ายกลับ (ดังกล่าวข้างต้น) ดูวิธีใช้ ThreeTenABP … .
โครงการThreeTen-Extraขยาย java.time ด้วยคลาสเพิ่มเติม โปรเจ็กต์นี้เป็นพื้นที่พิสูจน์สำหรับการเพิ่ม java.time ในอนาคต คุณอาจพบว่าการเรียนที่มีประโยชน์บางอย่างที่นี่เช่นInterval
, YearWeek
, YearQuarter
และอื่น ๆ อีกมากมาย