จะจัดรูปแบบการประทับเวลา java.sql เพื่อแสดงได้อย่างไร?


103

ฉันจะจัดรูปแบบการประทับเวลา java.sql ตามที่ฉันชอบได้อย่างไร (เป็นสตริงเพื่อการแสดงผล)

คำตอบ:


160

java.sql.Timestampjava.util.Dateขยาย คุณทำได้:

String s = new SimpleDateFormat("MM/dd/yyyy").format(myTimestamp);

หรือรวมเวลา:

String s = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss").format(myTimestamp);

3
วิธีนี้จะได้ผล แต่โปรดระวังเนื่องจาก SimpleDateFormat ไม่ปลอดภัยต่อเธรด
Brian Agnew

17
ขอเตือนเพียงเล็กน้อยว่าหากวัตถุ SimpleDateFormat เป็นวัตถุที่มีขอบเขตเฉพาะพื้นที่ (สร้างและใช้เฉพาะภายในวิธีการเท่านั้น) แสดงว่าเป็นเธรดปลอดภัยเนื่องจากสแต็กที่จะอยู่จะเป็น "เธรดปลอดภัย" โดยเนื้อแท้ (ตามที่ เป็นของเธรดเดียว)
quantum

5
หากต้องการรวมเวลาคุณจะต้องใช้ SimpleDateFormat ("MM / dd / yyyy hh: mm") หรือสิ่งที่คล้ายกัน
AverageMarcus

1
เพื่อให้สมบูรณ์สำหรับผู้ที่ต้องการ String S = new SimpleDateFormat ("MM / dd / yyyy HH: mm: ss"). format (myTimestamp);
Ishan Liyanage

27

ใช้ String.format (หรือjava.util.Formatter ):

Timestamp timestamp = ...
String.format("%1$TD %1$TT", timestamp)

แก้ไข:
โปรดดูเอกสารของ Formatter เพื่อทราบว่า TD และ TT หมายถึงอะไร: คลิกที่java.util.Formatter

ตัวแรก 'T' หมายถึง:

't', 'T'    date/time   Prefix for date and time conversion characters.

และอักขระที่ตามหลัง 'T':

'T'     Time formatted for the 24-hour clock as "%tH:%tM:%tS".
'D'     Date formatted as "%tm/%td/%ty". 

1
นี่คือคำตอบที่ดีที่สุดตามฉัน ไม่มีการสร้างออบเจ็กต์ที่ไม่จำเป็นเพียงเพื่อแปลงการประทับเวลาเป็นสตริง
สลิล

1
ตอนนี้น่าจะชัดเจนแล้วว่าจะหาเอกสารได้ที่ไหนและความหมาย
user85421

สง่างามมาก. เพื่อความชัดเจนการจัดรูปแบบที่เกิดจากตัวอย่างที่นี่มีลักษณะ05/30/17 00:39:18ดังนี้
Noumenon

@ นูเมนนอนขอบคุณนั่นคือรูปแบบ "ตามใจฉัน" ตามที่คำถามเรียกร้อง [:-)
user85421

10

สำหรับคำถามนี้ข้อเสนอแนะมาตรฐานของjava.text.SimpleDateFormatผลงาน แต่มีผลข้างเคียงที่โชคร้ายซึ่งSimpleDateFormat ไม่ปลอดภัยต่อเธรดและอาจเป็นที่มาของปัญหาที่น่ารังเกียจโดยเฉพาะอย่างยิ่งเนื่องจากจะทำให้ผลลัพธ์ของคุณเสียหายในสถานการณ์แบบมัลติเธรดและคุณจะไม่ ได้รับข้อยกเว้น!

ฉันขอแนะนำอย่างยิ่งให้ดูที่Jodaเพื่อหาอะไรทำนองนี้ ทำไม? เป็นไลบรารีเวลา / วันที่ที่สมบูรณ์ยิ่งขึ้นและใช้งานง่ายสำหรับ Java มากกว่าไลบรารีปัจจุบัน (และเป็นพื้นฐานของไลบรารีวันที่ / เวลา Java มาตรฐานใหม่ที่กำลังจะมาถึงดังนั้นคุณจะได้เรียนรู้เกี่ยวกับมาตรฐานในไม่ช้า API)


8
คำเตือนที่ดี แต่ง่ายมากที่จะระบุ - อย่าแชร์อินสแตนซ์ SimpleDateFormat โดยจัดเก็บไว้ในขอบเขตเซสชัน / ตัวแปรอินสแตนซ์ / บริบทคงที่แล้วเข้าถึงจากหลายเธรด เพียงสร้าง SimpleDateFormat () ใหม่ภายในวิธีการของคุณและทิ้งหลังจากใช้งาน นั่นคือเธรดปลอดภัย
Glen Best

แน่นอนว่าหากคุณต้องการจัดเก็บ / แชร์อินสแตนซ์ SimpleDateFormat จริงๆให้ซิงโครไนซ์การเข้าถึง: ซิงโครไนซ์ (simpleDateFormatInstance) {s = simpleDateFormatInstance.format (myTimeStamp)} หรือสร้างส่วนขยายที่กำหนดเองของคลาส SDF และดำเนินการนี้โดยอัตโนมัติภายในวิธีการจัดรูปแบบ
Glen Best

9

หากคุณใช้ MySQL และต้องการให้ฐานข้อมูลทำการแปลงให้ใช้สิ่งนี้:

DATE_FORMAT (วันที่รูปแบบ)

หากคุณต้องการจัดรูปแบบโดยใช้ Java ให้ใช้สิ่งนี้:

java.text.SimpleDateFormat

SimpleDateFormat dateFormat = new SimpleDateFormat("M/dd/yyyy");
dateFormat.format( new Date() );


0

java.time

ฉันกำลังให้คำตอบที่ทันสมัย Timestampชั้นสับด้านบนของที่มีอยู่แล้วออกแบบมาไม่ดีjava.util.Dateเรียนและล้าสมัยยาว แม้ว่าฉันสมมติว่าคุณได้รับTimestampAPI จากระบบเดิมที่คุณไม่สามารถอัพเกรดเป็น java.time ได้ในตอนนี้ เมื่อคุณทำเช่นนั้นให้แปลงเป็นแบบทันสมัยInstantและประมวลผลเพิ่มเติมจากที่นั่น

    DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM)
            .withLocale(Locale.GERMAN);
    
    Timestamp oldfashionedTimestamp = new Timestamp(1_567_890_123_456L);
    
    ZonedDateTime dateTime = oldfashionedTimestamp.toInstant()
            .atZone(ZoneId.systemDefault());
    String desiredFormat = dateTime.format(formatter);
    
    System.out.println(desiredFormat);

ผลลัพธ์ในเขตเวลาของฉัน:

07.09.2019 23:02:03 น

เลือกวิธีการที่ยาวหรือสั้นของรูปแบบที่คุณต้องการโดยระบุFormatStyle.SHORT, .MEDIUM, หรือ.LONG เลือกสถานที่ของคุณเองที่ผมใส่.FULL และเลือกโซนเวลาที่คุณต้องการเช่นLocale.GERMAN ZoneId.of("Europe/Oslo")A Timestampคือจุดในเวลาที่ไม่มีเขตเวลาดังนั้นเราจึงต้องมีเขตเวลาเพื่อที่จะสามารถแปลงเป็นปีเดือนวันชั่วโมงนาที ฯลฯ หากคุณTimestampมาจากค่าฐานข้อมูลประเภทที่timestampไม่มีเขตเวลา (โดยทั่วไปไม่ใช่ แนะนำ แต่น่าเสียดายที่มักจะเห็น) ZoneId.systemDefault()มีแนวโน้มที่จะให้ผลลัพธ์ที่ถูกต้อง อีกทางเลือกหนึ่งและง่ายกว่าเล็กน้อยในกรณีนี้คือแทนที่จะแปลงเป็นการLocalDateTimeใช้งานoldfashionedTimestamp.toLocalDateTime()แล้วจัดรูปแบบLocalDateTimeในลักษณะเดียวกับที่ฉันทำกับไฟล์ZonedDateTime.


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