2012-10-13 11 views
5

Mam prostą klasę jednostki, która ma właściwość Date. Ta właściwość odpowiada kolumnie datetime MySQL.Trwała data w bazie danych nie równa się pobranej daty

@Entity 
public class Entity { 

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

} 

To właśnie test integracja pisałem wygląda następująco:

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); 

spodziewałbym te dwie daty, aby być równe, ale nie są one! Właściwie mam:

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

więc jest mała szczelina pomiędzy dwiema datami. Naprawdę zastanawiam się, skąd ta luka może pochodzić. Nie zawsze jest taka sama i zmienia się za każdym razem, gdy rozpoczynam testowanie. W mojej bazie danych zapisana data to 2012-10-13 22: 15: 38.0.

Czy naprawdę muszę wyczyścić gdzieś milisekundy?

Odpowiedz

3

Z MySQL documentation:

datetime czy godzinę wartość może zawierać tylną część ułamkową sekund do maksymalnie mikrosekund (6 znaków) precyzją. Mimo że rozpoznawana jest część ułamkowa , jest ona odrzucana z wartości przechowywanych w kolumnach DATETIME lub TIMESTAMP. Aby uzyskać informacje o ułamkowej obsłudze sekund w MySQL, zobacz Rozdział 11.1.5.6, "Ułamkowe sekundy w Wartości Czasu".

Należy pamiętać, że nie należy stosować równe porównać dat tak, ponieważ różne Data podklasy mają implementacje buggy, które powodują problemy, takie jak 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 
+0

Więc powinno Ged pozbyć części milisekund z czymś takim: Kalendarz kalendarza = Calendar.getInstance(); calendar.setTime (data); calendar.set (Calendar.MILLISECOND, 0); – Tunaki