วิธีรับการประทับเวลาปัจจุบันในรูปแบบสตริงใน Java “yyyy.MM.dd.HH.mm.ss”


174

วิธีรับการประทับเวลาในรูปแบบสตริงใน Java "yyyy.MM.dd.HH.mm.ss"

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Timestamp());

นี่คือสิ่งที่ฉันมี แต่ Timestamp () ต้องใช้พารามิเตอร์ ...


เตรียมพร้อมStatement.setTimestamp (1, Timestamp ใหม่ (System.currentTimeMillis ()));
Rajat

คุณได้รับข้อผิดพลาดอะไร
Robert Columbia

FYI ซึ่งเป็นคลาสวันที่เก่าแก่ที่ลำบากมากเช่นSimpleDateFormatและjava.sql.Timestampตอนนี้เป็นมรดกซึ่งถูกแทนที่ด้วยคลาสjava.time ที่สร้างขึ้นใน Java 8 และใหม่กว่า ดูการสอนโดยออราเคิล
Basil Bourque

คำตอบ:


202

แทนที่

new Timestamp();

กับ

new java.util.Date()

เนื่องจากไม่มีตัวสร้างเริ่มต้นสำหรับTimestampหรือคุณสามารถทำได้ด้วยวิธีการ:

new Timestamp(System.currentTimeMillis());

5
FYI ซึ่งเป็นคลาสวันที่เก่าแก่ที่ลำบากมากเช่นjava.util.Dateและjava.sql.Timestampตอนนี้เป็นมรดกซึ่งถูกแทนที่ด้วยคลาสjava.time ที่สร้างขึ้นใน Java 8 และใหม่กว่า ดูการสอนโดยออราเคิล
Basil Bourque

160

ใช้java.util.Dateคลาสแทนการประทับเวลา

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Date());

คุณจะได้รับวันที่ปัจจุบันในรูปแบบที่ระบุ


5
สิ่งนี้ช่วยฉันออกไปและฉันได้ทำการเปลี่ยนแปลงบางอย่างดังนั้นฉันจึงไม่ต้องนำเข้า new java.text.SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new java.util.Date())
Pini Cheyni

ดีกว่าnew SimpleDateFormat("yyyy.MM.dd HH:mm:ss").format(new Date());
Zon

36

TL; DR

ใช้คลาสjava.time ที่ทันสมัยเท่านั้น ไม่เคยใช้เรียนมรดกที่น่ากลัวเช่นSimpleDateFormat, หรือDatejava.sql.Timestamp

ZonedDateTime                    // Represent a moment as perceived in the wall-clock time used by the people of a particular region ( a time zone).
.now(                            // Capture the current moment.
    ZoneId.of( "Africa/Tunis" )  // Specify the time zone using proper Continent/Region name. Never use 3-4 character pseudo-zones such as PDT, EST, IST. 
)                                // Returns a `ZonedDateTime` object. 
.format(                         // Generate a `String` object containing text representing the value of our date-time object. 
    DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" )
)                                // Returns a `String`. 

หรือใช้เขตเวลาเริ่มต้นปัจจุบันของJVM

ZonedDateTime
.now( ZoneId.systemDefault() )
.format( DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" ) )

java.time & JDBC 4.2

วิธีการที่ทันสมัยใช้คลาสjava.timeตามที่เห็นด้านบน

หากไดรเวอร์ JDBCของคุณสอดคล้องกับJDBC 4.2คุณสามารถแลกเปลี่ยนวัตถุjava.timeโดยตรงกับฐานข้อมูล การใช้งานและPreparedStatement::setObjectResultSet::getObject

ใช้ java.sql สำหรับไดรเวอร์ก่อน JDBC 4.2 เท่านั้น

หากไดรเวอร์ JDBC ของคุณยังไม่สอดคล้องกับ JDBC 4.2 สำหรับการสนับสนุนประเภทjava.timeคุณต้องถอยกลับไปใช้คลาส java.sql

กำลังจัดเก็บข้อมูล

OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ) ;  // Capture the current moment in UTC.
myPreparedStatement.setObject(  , odt ) ;

กำลังดึงข้อมูล

OffsetDateTime odt = myResultSet.getObject(  , OffsetDateTime.class ) ;

ประเภท java.sql เช่นjava.sql.Timestampควรใช้สำหรับการถ่ายโอนเข้าและออกจากฐานข้อมูลเท่านั้น แปลงเป็นประเภท java.time ทันทีใน Java 8 และใหม่กว่า

java.time.Instant

java.sql.Timestampแผนที่ไปยังjava.time.Instantช่วงเวลาบนไทม์ไลน์ในเวลา UTC สังเกตเห็นวิธีการแปลงใหม่ที่toInstantเพิ่มในคลาสเก่า

java.sql.Timestamp ts = myResultSet.getTimestamp(  );
Instant instant = ts.toInstant(); 

เขตเวลา

สมัคร / โซนเวลาที่ต้องการคาดว่า ( ZoneId) ZonedDateTimeเพื่อให้ได้

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

การจัดรูปแบบสตริง

ใช้ a DateTimeFormatterเพื่อสร้างสตริงของคุณ รหัสรูปแบบคล้ายกับรหัสjava.text.SimpleDateFormatแต่ไม่ตรงกันดังนั้นให้อ่านเอกสารอย่างละเอียด

DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" );
String output = zdt.format( formatter );

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

ISO 8601

หากคุณมีคำพูดใด ๆ ในเรื่องนี้ฉันขอแนะนำให้คุณพิจารณาใช้รูปแบบมาตรฐานISO 8601แทนที่จะใช้ตัวคุณเอง รูปแบบมาตรฐานค่อนข้างคล้ายกับของคุณ ตัวอย่างเช่น
2016-02-20T03:26:32+05:30.

คลาส java.time ใช้รูปแบบมาตรฐานเหล่านี้เป็นค่าเริ่มต้นดังนั้นไม่จำเป็นต้องระบุรูปแบบ ZonedDateTimeระดับขยายรูปแบบมาตรฐานโดยต่อท้ายชื่อของโซนเวลา (การปรับปรุงที่ชาญฉลาด)

String output = zdt.toString(); // Example: 2007-12-03T10:15:30+01:00[Europe/Paris]

แปลงเป็น java.sql

คุณสามารถแปลงจาก java.time java.sql.Timestampกลับไป สารสกัดจากInstantZonedDateTime

มีการเพิ่มวิธีการใหม่ในคลาสเก่าเพื่อช่วยในการแปลงเป็น / จากคลาส java.time

java.sql.Timestamp ts = java.sql.Timestamp.from( zdt.toInstant() );

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


เกี่ยวกับ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 , Java SE 11และใหม่กว่า - ส่วนหนึ่งของ 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และอื่น ๆ อีกมากมาย


วิธีที่ถูกต้องในการรับการประทับเวลานาฬิกาปัจจุบันในรูปแบบ "yyyy.MM.dd.HH.mm.ss" คืออะไร? หากไม่มีการระบุสตริงที่มีการเข้ารหัสอย่างแน่นหนาในเขตเวลาท้องถิ่นของฉัน นั่นคือสิ่งที่ผู้เริ่มต้นหัวข้อถามและฉันไม่สามารถหาได้ในคำตอบของคุณ ...
t7ko

@ t7ko ฉันเพิ่มบรรทัดโค้ดตัวอย่างในส่วนtl; dr ที่แสดงวิธีขออย่างชัดเจนสำหรับเขตเวลาเริ่มต้นปัจจุบันของ JVM การเรียก `ตอนนี้ () 'โดยไม่มีข้อโต้แย้งใด ๆ จะทำเช่นเดียวกัน แต่ไม่ชัดเจนหากคุณต้องการใช้ค่าเริ่มต้นหรือหากคุณไม่รู้หรือลืมเกี่ยวกับปัญหาสำคัญของเขตเวลา
Basil Bourque

32

คุณสามารถใช้ java.util.Date แทน Timestamp:

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Date());

6

วิธีที่เหมาะสมกว่าคือการระบุภูมิภาค Locale เป็นพารามิเตอร์ใน Constructor ตัวอย่างด้านล่างใช้ภูมิภาค US Locale การจัดรูปแบบวันที่มีความไวต่อสถานที่และใช้สถานที่เกิดเหตุเพื่อปรับแต่งข้อมูลที่เกี่ยวข้องกับศุลกากรและแบบแผนของภูมิภาคของผู้ใช้สถานที่เกิดเหตุ (Java Platform SE 7)

String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss", Locale.US).format(new Date());

1
ไม่มีสิ่งเช่น "Locale Zone" ฉันสงสัยว่าคุณสับสนLocaleและเขตเวลาที่ไม่เกี่ยวข้อง Localeควบคุมบรรทัดฐานทางวัฒนธรรมสำหรับการจัดรูปแบบและภาษามนุษย์ที่ใช้สำหรับชื่อของเดือน / วัน โซนเวลาปรับการแสดงวันเวลาที่จะเหมาะสมไปยังภูมิภาคบางเวลาผนังนาฬิกา ในกรณีของคำถามนี้สถานที่ไม่เกี่ยวข้องเนื่องจากไม่มีปัญหาการจัดรูปแบบที่จะใช้บรรทัดฐานทางวัฒนธรรมและไม่มีชื่อของเดือน / วันในการแปลเป็นภาษามนุษย์ใด ๆ
Basil Bourque

@BasilBourque ขอบคุณสำหรับข้อมูลของคุณ ฉันได้อัปเดตคำตอบให้ชัดเจนยิ่งขึ้นแล้ว
user3144836

4

คุณสามารถใช้สิ่งต่อไปนี้

new java.sql.Timestamp(System.currentTimeMillis()).getTime()

Result : 1539594988651

หวังว่าจะช่วยได้ เพียงแค่ข้อเสนอแนะของฉันและไม่ใช่สำหรับคะแนนสะสม


ไม่มีรูปแบบสตริงที่ขอ นอกจากนี้ฉันกลัวว่าสิ่งเดียวที่เพิ่มในสองคำตอบที่คล้ายกันคือภาวะแทรกซ้อนที่ไม่จำเป็น ...
Ole VV

4

ใช้java.timeคลาสที่ทันสมัยถ้าคุณใช้จาวา 8 หรือใหม่กว่า

String s = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now());

คำตอบของ Basil Bourque ค่อนข้างดี แต่มันยาวเกินไป หลายคนคงไม่มีความอดทนในการอ่าน คำตอบ 3 อันดับแรกนั้นเก่าเกินไปและอาจทำให้เข้าใจผิดว่า Java new bee ดังนั้นฉันจึงให้คำตอบสั้น ๆ และทันสมัยสำหรับผู้ที่มาใหม่ SimpleDateFormatหวังว่าคำตอบนี้สามารถลดการใช้งานของสาหัส

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