ฉันจะสร้าง 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.setObjectResultSet.getObjectjava.timeกรอบถูกสร้างขึ้นใน Java 8 และต่อมา ชั้นเรียนเหล่านี้แย่งลำบากเก่ามรดกเรียนวันที่เวลาเช่นjava.util.Date, และCalendarSimpleDateFormat
โครงการ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แล้วเมื่อคุณจำเป็นต้องตั้งค่าเท่ากับวันที่ปัจจุบันเพียงแค่ตั้งค่าเท่ากับtimestampnew Date()