วิธีการจัดเก็บวันที่และเวลา Java Date เป็น Mysql ด้วย JPA


104

มีเนื้อหาใดบ้างที่สามารถบอกฉันได้ว่าฉันจะจัดเก็บ Java Date ถึง Mysql datetime ได้อย่างไร ...

เมื่อฉันพยายามทำเช่นนั้น ... จะมีการจัดเก็บเฉพาะวันที่และเวลายังคงเป็น 00:00:00 ในร้านค้าวันที่ Mysql เช่นนี้ ...

2009-09-22 00:00:00

ฉันต้องการไม่เพียง แต่วันที่ แต่ยังรวมถึงเวลา ...

2009-09-22 08:08:11

ฉันใช้ JPA (Hibernate) กับคลาส Spring mydomain ใช้ java.util.Date แต่ฉันได้สร้างตารางโดยใช้แบบสอบถามที่เขียนด้วยลายมือ ...

นี่คือคำสั่งสร้างของฉัน

CREATE TABLE ContactUs (id BIGINT auto_increment, 
                        userName VARCHAR(30), 
                        email VARCHAR(50), 
                        subject VARCHAR(100), 
                        message VARCHAR(1024), 
                        messageType VARCHAR(15), 
                        contactUsTime datetime, 
                        primary key(id))
                        TYPE=InnoDB;

ชิ้นส่วนของรหัสของคุณบางที?
Bozho


1
วันนี้คุณไม่ควรใช้งานอีกต่อไปjava.util.Date(ในปี 2010 อาจไม่มีทางเลือกที่ดีกว่า) ควรใช้คลาสสมัยใหม่เช่นjava.time.Instantหรือjava.time.LocalDateTimeขึ้นอยู่กับข้อกำหนดที่แน่นอนสำหรับวัน - เวลาที่คุณต้องการจัดเก็บ
Ole VV

คำตอบเก่า ๆ เหล่านี้บางส่วนมีอันดับสูงในการจัดอันดับของ Google ใน Java 8+ เราสามารถใช้ LocalDateTime เพื่อบันทึก datetime แทนการใช้ @Temporal เพื่อบันทึกในรูปแบบ
HopeKing

readyStatement.setTimestamp (1, Timestamp ใหม่ (System.currentTimeMillis ()));
Rajat

คำตอบ:


165

ดูในลิงค์:

http://www.coderanch.com/t/304851/JDBC/java/Java-date-MySQL-date-conversion

รหัสต่อไปนี้ช่วยแก้ปัญหาได้:

java.util.Date dt = new java.util.Date();

java.text.SimpleDateFormat sdf = 
     new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

String currentTime = sdf.format(dt);

' currentTime ' นี้ถูกแทรกลงในคอลัมน์ที่มีประเภท DateTime และทำได้สำเร็จ


4
แต่ currentTime เป็นออบเจ็กต์ String และใน db เราใช้วันที่และเวลาเป็นประเภทข้อมูลฉันคิดว่ามันจะไม่ถูกแทรกใช่ไหม
reddy

yyyy-MM-dd HH:mm:ssสำคัญมาก. จดการใช้อักษรตัวพิมพ์ใหญ่
biniam

92

ใส่คำอธิบายประกอบฟิลด์ของคุณ (หรือ getter) ด้วย@Temporal(TemporalType.TIMESTAMP)ดังนี้:

public class MyEntity {
    ...
    @Temporal(TemporalType.TIMESTAMP)
    private java.util.Date myDate;
    ...
}

ที่ควรทำเคล็ดลับ


2
นี่คือคำตอบแน่นอน!
Perneel

2
สำหรับสิ่งนี้นี่คือคำตอบที่เหมาะสม
Ryan

3
โปรดทราบว่าหากคุณเลือกวิธีนี้วันที่ของคุณจะปรากฏเป็นเวลาประทับเมื่อดึงข้อมูลจากฐานข้อมูล มันจะไม่มีรูปแบบที่ดี 'yyyy-MM-dd .... ')
จอน

37

คุณอาจใช้java.sql.Date? ในขณะที่มีความละเอียดระดับมิลลิวินาทีเป็นคลาส Java (เป็นคลาสย่อยของjava.util.Dateการตัดสินใจออกแบบที่ไม่ดี) ไดรเวอร์ JDBC จะตีความเป็นวันที่โดยไม่มีส่วนประกอบของเวลา คุณต้องใช้java.sql.Timestampแทน


1
ฉันจะไม่ใช้java.sql.Dateหรือjava.sql.Timestampในคลาสโดเมน แต่ฉันเดาว่ามันถูกเขียนขึ้นก่อนการแก้ไข OP
Pascal Thivent

ฉันจะ. java.util.Date วัตถุไม่ได้เปรียบเทียบกับวัตถุ java.sql.Timestamp ที่มีผลลัพธ์ที่คาดเดาได้ทั้งหมด
Doug Moscrop

7

อาจเป็นเพราะวันที่ java ของคุณมีรูปแบบที่แตกต่างจากmysql format( YYYY-MM-DD HH:MM:SS)

ทำเช่นนี้

 DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
 Date date = new Date();
 System.out.println(dateFormat.format(date));

คุณได้กล่าวถึงรูปแบบที่ถูกต้องในการอ้างอิงแล้วใช้รูปแบบที่ไม่ถูกต้องในโค้ด
Merric Huffstutler

6

คุณจะได้รับรูปแบบเวลา 2011-07-18 +

long timeNow = Calendar.getInstance().getTimeInMillis();
java.sql.Timestamp ts = new java.sql.Timestamp(timeNow);
...
preparedStatement.setTimestamp(TIME_COL_INDEX, ts);

5

mysql datetime -> GregorianCalendar

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = format.parse("2012-12-13 14:54:30"); // mysql datetime format
GregorianCalendar calendar = new GregorianCalendar();
calendar.setTime(date);
System.out.println(calendar.getTime());

GregorianCalendar -> วันที่และเวลาของ mysql

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String string = format.format(calendar.getTime());
System.out.println(string);


1

ใช้รหัสต่อไปนี้เพื่อแทรกวันที่ลงใน MySQL แทนที่จะเปลี่ยนรูปแบบวันที่ของเราเพื่อให้เป็นไปตามข้อกำหนดของ MySql เราสามารถช่วยฐานข้อมูลในการจดจำวันที่ของเราได้โดยการตั้งค่าSTR_TO_DATE(?, '%l:%i %p')พารามิเตอร์

ตัวอย่างเช่น 2014-03-12 สามารถแสดงเป็น STR_TO_DATE('2014-03-12', '%Y-%m-%d')

preparedStatement = connect.prepareStatement("INSERT INTO test.msft VALUES (default, STR_TO_DATE( ?, '%m/%d/%Y'), STR_TO_DATE(?, '%l:%i %p'),?,?,?,?,?)"); 

1

มันง่ายมากแม้ว่าเงื่อนไขในคำตอบนี้จะอยู่ใน mysql ประเภทข้อมูลคอลัมน์คือวันที่และเวลาและคุณต้องการส่งข้อมูลจากรหัส java ไปยัง mysql:

java.util.Date dt = java.util.Date ใหม่ ();
whatever your code object may be.setDateTime (dt);

สิ่งสำคัญคือเพียงแค่เลือกวันที่และรูปแบบของมันก็เป็นไปตามรูปแบบ mysql แล้วส่งไปโดยไม่จำเป็นต้องแก้ไขเพิ่มเติม


0

จริงๆแล้วคุณอาจไม่ได้ใช้ SimpleDateFormat คุณสามารถใช้สิ่งนี้ได้

  @JsonSerialize(using=JsonDateSerializer.class)
  @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd/MM/yyyy HH:mm:ss")
  private Date blkDate;

ด้วยวิธีนี้คุณสามารถรับวันที่ที่มีรูปแบบตามที่ระบุได้โดยตรง


0

ฉันยังคงชอบวิธีการในบรรทัดเดียว

new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Calendar.getInstance().getTime())

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