I'm experiencing a very weird behaviour while saving dates on database. On my (Linux centOS 6.2) server I use glassfish application server (3.1.1 - build 12) and Java (1.7.0_09), the application is developed in Java + GWT, and it uses PostgreSQL server (9.2.1). Inside the application there are several date fields that are saved on the db. The date fields use datepicker (http://code.google.com/p/gwt-datepicker, r30).
The date attribute of the db relation is date type (not timestamp). Some dates are saved a day before in the database. The problem happens only for dates between intervals, e.g. between 31.03.1968 and 27.10.1968, which makes me think some kind of summer time issue. But since it doesn't happen for 1969, for example, I cannot isolate the problem very well. I'm trying to find some other date interval inside which the problem happens. For example, if I select 19.05.1968 in the application, after saving in the database the date is saved as 18.05.1968.
The weird thing is that I have another istance of the same application on another server, and for the same dates they are saved correctly. This makes me think that the problem could rely either on:
I tried to set to Europe/Rome (my timezone) every configuration possible of my server, but nothing. Any idea? How could I solve or investigate this problem?
UPDATE: 1968 was a leap year. The problem also happens in 1972, which is again a leap year. Summarizing: the "date-saved-one-day-before" problem happens in leap years during summer time date interval.
The code portion where the date oject is created is:
Date d = dateField.getSelectedDate();
if (d != null) {
txtVal = DateTimeFormat.getFormat("dd/MM/yyyy").format(d);
}
where dateField is declared as:
transient private DatePicker dateField;
The package is org.zenika.widget.client.datePicker.DatePicker
(gwt-datepicker-r30 mentioned before), and DateTimeFormat refers to com.google.gwt.i18n.shared.DateTimeFormat
UPDATE after accepting the answer:
I used this workaround: when I create a date, I use the following code:
final long hours12 = 12L * 60L * 60L * 1000L;
Date d = new Date(d1.getTime() + hours12);
Just set the time of the date to 12:00 (instead of the default 0:00) and you should be fine. The issue is that the GWT time zone library does not include all leap years from before 1990, and thus you will get a wrong time at the server (since the value is sent in the form of a timestamp and is one hour off).
By the way: GWT has a built-in date picker, see its demo at http://gwt.google.com/samples/Showcase/Showcase.html#!CwDatePicker
Are you using java.util.date or java.sql. date (the latter is the correct one)? I had a similar problem with SQL Server, even if it was regular and yes, related with the summertime.
Basically, you store a Java date as midnight of a particular day. if summertime, the date get moved to the day before at 23:00, and then the time gets truncated! If you send the date with a "random" timestamp you will experience the problem one time out of 24 during the summer.
I don't remember exactly the solution (which will not help you directly as it refers to a different DBMS) but there was a setting in the dB to say "store the date as you receive it". You can test if this is the case by changing the dbcolumn to timestamp and looking at how the time get stored.
I did a bit of research - it seems the gwt-datepicker has a lot of issues! http://code.google.com/p/google-apps-script-issues/issues/detail?id=2022 http://code.google.com/p/google-apps-script-issues/issues/detail?id=2001
I would not be surprised if their calculation had a bug on leap years. Also, it is entirely possible it is just a mismatch between what you are doing and what you think you are doing - working with Dates is a surprisingly difficult matter
To check, try:
final java.util.Date ud = dateField.getSelectedDate();;
final java.sql.Date sd = new java.sql.Date(ud.getTime());
System.out.println(ud);// this is what you pick from the DatePicker
System.out.println(sd);// this is what will be stored on the database
And see if they match during summer on leap years. If it is a GWT bug, http://code.google.com/p/google-apps-script-issues/ is the right place to report it
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With