6

Date プロパティを持つ単純なエンティティ クラスがあります。このプロパティは、MySQL の datetime 列に対応します。

@Entity
public class Entity {

    @Column(name = "start_date")
    @Temporal(TemporalType.TIMESTAMP)
    private java.util.Date startDate;

}

これは、私が書いた統合テストのようなものです:

java.util.Date now = new java.util.Date();
Entity entity = new Entity();
entity.setStartDate(now);
entityService.save(entity); // save entity to database
entity = entityService.get(entity.getId()); // get entity back from database
Assert.assertEquals(entity.getStartDate(), now);

これらの 2 つの日付が同じであることを期待しますが、そうではありません。実際、私は持っています:

now.getTime() = 1350160029831
entity.getStartDate().getTime() = 1350160029000

そのため、2 つの日付の間にはわずかなギャップがあります。このギャップがどこから来るのか、私は本当に疑問に思っています。常に同じとは限らず、テスト プロセスを開始するたびに異なります。私のデータベースでは、保存されている日付は 2012-10-13 22:15:38.0 です。

本当にどこかでミリ秒をクリアする必要がありますか?

4

1 に答える 1

4

MySQLのドキュメントから:

DATETIME または TIMESTAMP 値には、マイクロ秒 (6 桁) までの精度で秒の小数部分を末尾に含めることができます。この小数部は認識されますが、DATETIME または TIMESTAMP 列に格納された値からは破棄されます。MySQL での小数秒のサポートについては、セクション11.1.5.6「時間値の小数秒」を参照してください。

さまざまな Date サブクラスにはバグのある実装があり、次のような問題が発生するため、とにかく日付を比較するために equals を使用しないでくださいa.equals(b) && !b.equals(a)

java.util.Date d1 = java.sql.Date.valueOf("2012-01-01");
java.util.Date d2 = new java.util.Date(d1.getTime());
java.util.Date d3 = new java.sql.Timestamp(d1.getTime());

System.out.println(d1.equals(d2)); // true
System.out.println(d2.equals(d1)); // true
System.out.println(d1.equals(d3)); // true
System.out.println(d3.equals(d1)); // false
System.out.println(d2.equals(d3)); // true
System.out.println(d3.equals(d2)); // false
于 2012-10-13T20:45:02.127 に答える