ฉันจะสร้าง Timestamp ด้วยวันที่ 23/09/2007 ได้อย่างไร
ฉันจะสร้าง Timestamp ด้วยวันที่ 23/09/2007 ได้อย่างไร
คำตอบ:
โดยผมคิดว่าคุณหมายถึงTimestamp
java.sql.Timestamp
คุณจะสังเกตเห็นว่าคลาสนี้มีตัวสร้างที่ยอมรับการlong
โต้แย้ง คุณสามารถแยกวิเคราะห์โดยใช้DateFormat
คลาส:
DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
Date date = dateFormat.parse("23/09/2007");
long time = date.getTime();
new Timestamp(time);
java.util.Date
, java.util.Calendar
และjava.text.SimpleDateFormat
ตอนนี้มรดกแทนที่โดยjava.timeชั้นเรียนที่สร้างขึ้นใน Java 8 และต่อมา ดูการสอนโดยออราเคิล
อะไรประมาณนี้
java.sql.Timestamp timestamp = java.sql.Timestamp.valueOf("2007-09-23 10:10:10.0");
คุณหมายถึงอะไรประทับเวลา? หากคุณหมายถึงมิลลิวินาทีนับตั้งแต่ยุค Unix:
GregorianCalendar cal = new GregorianCalendar(2007, 9 - 1, 23);
long millis = cal.getTimeInMillis();
หากคุณต้องการวัตถุ java.sql.Timestamp จริง:
Timestamp ts = new Timestamp(millis);
Calendar.SEPTEMBER
java.sql.Timestamp.from (
LocalDate.of ( 2007 , 9 , 23 )
.atStartOfDay( ZoneId.of ( "America/Montreal" ) )
.toInstant()
)
มาอัปเดตหน้านี้โดยแสดงโค้ดโดยใช้java.timeกรอบสร้างใน Java 8 ขึ้นไป
คลาสใหม่เหล่านี้ได้รับแรงบันดาลใจจากJoda-Timeซึ่งกำหนดโดยJSR 310และขยายโดยThreeTen-Extraโครงการ พวกเขาเข้ามาแทนที่คลาสวันเวลาเก่าที่มีปัญหาซึ่งมาพร้อมกับ Java เวอร์ชันแรก ๆ
ใน java.time Instant
คือช่วงเวลาหนึ่งบนไทม์ไลน์ใน UTC A ZonedDateTime
คือการปรับเปลี่ยนทันทีเป็นเขตเวลา ( ZoneId
)
เขตเวลาเป็นสิ่งสำคัญสำหรับที่นี่ วันของการSeptember 23, 2007
ไม่สามารถได้รับการแปลถึงช่วงเวลาในระยะเวลาโดยไม่ต้องใช้โซนเวลา พิจารณาว่าวันใหม่เริ่มต้นในปารีสเร็วกว่าที่มอนทรีออลซึ่งยังคงเป็น“ เมื่อวาน”
นอกจากนี้ java.sql.Timestamp แสดงทั้งวันที่และเวลาของวัน ดังนั้นเราต้องฉีดเวลาของวันเพื่อให้ตรงกับวันที่ เราถือว่าคุณต้องการช่วงเวลาแรกของวันเป็นช่วงเวลาของวัน โปรดทราบว่านี่ไม่ใช่เวลาเสมอไป00:00:00.0
เนื่องจากเวลาออมแสงและอาจเป็นความผิดปกติอื่น ๆ
โปรดทราบว่าไม่เหมือนกับคลาส java.util.Date แบบเก่าและต่างจาก Joda-Time ประเภท java.time มีความละเอียดของนาโนวินาทีแทนที่จะเป็นมิลลิวินาที ตรงกับความละเอียดของ java.sql.Timestamp
โปรดสังเกตว่า java.sql.Timestamp มีนิสัยที่น่ารังเกียจในการใช้เขตเวลาเริ่มต้นปัจจุบันของ JVM กับค่าวันที่ - เวลาโดยปริยายเมื่อสร้างการแสดงสตริงด้วยtoString
วิธีการ คุณจะเห็นAmerica/Los_Angeles
เขตเวลาของฉันที่ใช้ ในทางตรงกันข้ามคลาส java.time มีเหตุผลมากกว่าโดยใช้รูปแบบISO 8601 มาตรฐาน
LocalDate d = LocalDate.of ( 2007 , 9 , 23 ) ;
ZoneId z = ZoneId.of ( "America/Montreal" ) ;
ZonedDateTime zdt = d.atStartOfDay( z ) ;
Instant instant = zdt.toInstant() ;
java.sql.Timestamp ts = java.sql.Timestamp.from ( instant ) ;
ถ่ายโอนไปยังคอนโซล
System.out.println ( "d: " + d + " = zdt: " + zdt + " = instant: " + instant + " = ts: " + ts );
เมื่อเรียกใช้.
d: 2007-09-23 = zdt: 2007-09-23T00: 00-04: 00 [อเมริกา / มอนทรีออล] = ทันที: 2007-09-23T04: 00: 00Z = ts: 2007-09-22 21:00: 00.0
อย่างไรก็ตามใน JDBC 4.2 คุณสามารถใช้ประเภท java.time ได้โดยตรง ไม่จำเป็นต้องjava.sql.Timestamp
.
PreparedStatement.setObject
ResultSet.getObject
java.timeกรอบถูกสร้างขึ้นใน Java 8 และต่อมา ชั้นเรียนเหล่านี้แย่งลำบากเก่ามรดกเรียนวันที่เวลาเช่นjava.util.Date
, และCalendar
SimpleDateFormat
โครงการJoda-Timeขณะนี้อยู่ในโหมดการบำรุงรักษาแนะนำให้ย้ายไปที่คลาสjava.time
ต้องการเรียนรู้เพิ่มเติมโปรดดูที่ออราเคิลกวดวิชา และค้นหา Stack Overflow สำหรับตัวอย่างและคำอธิบายมากมาย สเปกJSR 310
คุณสามารถแลกเปลี่ยนวัตถุjava.timeโดยตรงกับฐานข้อมูลของคุณ ใช้ไดรเวอร์ JDBC ที่สอดคล้องกับJDBC 4.2หรือใหม่กว่า ไม่จำเป็นต้องมีสตริงไม่จำเป็นต้องมีjava.sql.*
คลาส
จะหาคลาส java.time ได้ที่ไหน?
โครงการThreeTen-Extraขยาย java.time ด้วยคลาสเพิ่มเติม โปรเจ็กต์นี้เป็นพื้นที่พิสูจน์สำหรับการเพิ่ม java.time ในอนาคต คุณอาจพบว่าการเรียนที่มีประโยชน์บางอย่างที่นี่เช่นInterval
, YearWeek
, YearQuarter
และอื่น ๆ อีกมากมาย
คุณสามารถทำสิ่งต่อไปนี้ได้:
// untested
Calendar cal = GregorianCalendar.getInstance();
cal.set(Calendar.DAY_OF_MONTH, 23);// I might have the wrong Calendar constant...
cal.set(Calendar.MONTH, 8);// -1 as month is zero-based
cal.set(Calendar.YEAR, 2009);
Timestamp tstamp = new Timestamp(cal.getTimeInMillis());
ตามAPIตัวสร้างที่ยอมรับปีเดือนและอื่น ๆ จะเลิกใช้งาน คุณควรใช้ Constructor ซึ่งยอมรับไฟล์. คุณสามารถใช้การใช้งานปฏิทินเพื่อสร้างวันที่ที่คุณต้องการและเข้าถึงการแสดงเวลาเป็นเวลานานตัวอย่างเช่นด้วยเมธอดgetTimeInMillis
DateTime
ออบเจ็กต์ นั่นหมายความว่าผลลัพธ์ของคุณจะแตกต่างกันไปตามคอมพิวเตอร์ต่างๆหรือการกำหนดค่าโฮสต์ OS หรือการตั้งค่า JVM เพื่อให้ได้ผลลัพธ์ที่คาดเดาได้ให้ส่งเขตเวลาไปยังตัวDateTime
สร้างนั้น เลือกชื่อเขตเวลาที่เหมาะสมสำหรับความตั้งใจของคุณ ตัวอย่างเช่นDateTimeZone.forID( "America/Montreal" )
หรือDateTimeZone.UTC
.
DateTime
วัตถุเป็นมิลลิวินาทีตั้งแต่ยุค แทนที่.toDate().getTime()
ด้วย.getMillis()
.
DateTimeZone.getDefault()
และส่งผลลัพธ์เป็นอาร์กิวเมนต์ที่ไม่บังคับ (อย่างไรก็ตามสำหรับLocale.getDefault()
ปัญหาเดียวกันกับความคลุมเครือของข้อโต้แย้งที่เป็นทางเลือก)
คำตอบทั่วไปมากขึ้นจะนำเข้าjava.util.Date
แล้วเมื่อคุณจำเป็นต้องตั้งค่าเท่ากับวันที่ปัจจุบันเพียงแค่ตั้งค่าเท่ากับtimestamp
new Date()