I also checked the default PostgreSQL timezone (in the postgresql.conf file), which is set to "Poland".
2016-03-30 8:47 GMT+02:00 g kuczera <gkucz...@gmail.com>: > I observed that behavior on the production server and then confirmed it on > the test server, which is not accessed by any client, etc. I forgot to > mention that the calendar.getTimeZone().getDisplayName() call returns > "Central European Time". > > 2016-03-30 3:56 GMT+02:00 Kalle Korhonen <kalle.o.korho...@gmail.com>: > >> The same thread really reads the same value from the database every few >> seconds and it may come out different? I don't buy it, there must be >> something else going on at the same time. Are you sure it's the same >> value? >> Is there something else writing to it at the same time? Can the system >> default timezone change (perhaps also print out TimeZone.getDefault(), >> Date >> initialized to the default timezone). I'd still suspect some type of >> timezone issue. >> >> Kalle >> >> On Tue, Mar 29, 2016 at 3:39 PM, g kuczera <gkucz...@gmail.com> wrote: >> >> > Hi guys, >> > First of all, thanks for the answer and the effort you put into writing >> > them. >> > >> > I checked few things and read couple of articles about similar problems >> and >> > here is my little summary: >> > >> > - my PostgreSQL birthDate column's type is 'birthDate TIMESTAMP >> WITHOUT >> > TIME ZONE' >> > - the values contained by the column do not have the time part, the >> > year-month-day is used, eg. 1982-03-28 >> > - then the user Entity has the birth date field with annotations >> > >> > @Column(name = "birthDate ") >> > >> > @Temporal(TemporalType.DATE) >> > >> > private java.util.Date birthDate; >> > >> > >> > - the call calendar.getTimeZone().getDisplayName() returns >> > >> > The Calendar instance is created in this way: >> > >> > Calendar calendar = Calendar.getInstance(); >> > calendar.setTime(user.getBirthDate()); >> > >> > >> > So the TIMESTAMP value from the database is interpreted as the >> > java.util.Date, what is achieved by putting the Temporal annotation. >> Then, >> > when I call the getter (getBirthDate method) the "truncated" TIMESTAMP >> is >> > returned. >> > >> > But still, after fetching the birthDate for 4 times, the fifth one >> becomes >> > corrupted: >> > >> > 30-03-16 00:25:36:746 - {INFO} profil.ProfilEdition Thread >> > [qtp1357767732-54]; birth date equals (setupRender - getting from raw >> > query): 1982-03-28 00:00:00.0, 1982-03-28 00:00:00.0 >> > 30-03-16 00:25:44:497 - {INFO} profil.ProfilEdition Thread >> > [qtp1357767732-65]; birth date equals (setupRender - getting from raw >> > query): 1982-03-28 00:00:00.0, 1982-03-28 00:00:00.0 >> > 30-03-16 00:25:46:037 - {INFO} profil.ProfilEdition Thread >> > [qtp1357767732-60]; birth date equals (setupRender - getting from raw >> > query): 1982-03-28 00:00:00.0, 1982-03-28 00:00:00.0 >> > 30-03-16 00:25:46:884 - {INFO} profil.ProfilEdition Thread >> > [qtp1357767732-62]; birth date equals (setupRender - getting from raw >> > query): 1982-03-28 00:00:00.0, 1982-03-28 00:00:00.0 >> > 30-03-16 00:25:48:843 - {INFO} profil.ProfilEdition Thread >> > [qtp1357767732-63]; birth date equals (setupRender - getting from raw >> > query): 1982-03-27 23:00:00.0, 1982-03-27 23:00:00.0 >> > >> > The log comes from casting the raw query result to java.sql.Timestamp. >> The >> > value after comma is the same one, but casted to java.util.Date (these >> are >> > results of toString method).. >> > >> > I will continue to investigate the thing tomorrow. >> > >> > 2016-03-24 15:47 GMT+01:00 Cezary Biernacki <cezary...@gmail.com>: >> > >> > > Hi, >> > > I doubt it is a Tapestry related problem. I have seen similar issues, >> and >> > > they are generally caused by time zone translations. My guess is that >> > your >> > > database stores date birth as a timestamp (i.e. including specific >> hours >> > > and minutes) in some specific time zone, and your Java code retrieving >> > > timestamps translates it to a different time zone. To diagnose, you >> > should >> > > check what is actually stored in the database, what kind of data type >> is >> > > used to store date of birth (database engines often have many options >> to >> > > store dates and timestamps including or not time zones), what Java >> type >> > is >> > > returned by user.getBirthDate() and what is the actual returned value >> > > (exact content, not result of toString()), and what assumptions about >> > using >> > > time zones your JDBC driver is making. Typically problems arise when >> some >> > > parts of the systems treat time stamps as set in UTC and others apply >> > user >> > > (client) default time zone. To fix this, one should have methodically >> > > ensure that all parts are using consistent time zone policy, and any >> time >> > > zone translations occur only when necessary. >> > > >> > > Best regards, >> > > Cezary >> > > >> > > >> > > On Tue, Mar 22, 2016 at 8:55 PM, g kuczera <gkucz...@gmail.com> >> wrote: >> > > >> > > > Hi guys, >> > > > I do not really know if it is connected with tapestry or only the >> > > > Hibernate, but maybe that is the case. So there is a embedded >> calendar >> > on >> > > > the site, the one from tapestry-jquery library: >> > > > http://tapestry5-jquery.com/mixins/docscustomdatepicker >> > > > >> > > > If the user chose - during registration - the 28/03/1982 date, the >> > value >> > > > will be correctly save to the database. But if you want to change >> this >> > > date >> > > > and the calendar is going to be prepared, the date retrieved by the >> > > UserDao >> > > > (the birthDate field) equals to 27/03/1982. >> > > > >> > > > I use the DAOs layer, which uses the Hibernate session. It is >> > > automatically >> > > > passed as an argument during the binding process (in the AppModule >> > > class): >> > > > >> > > > binder.bind(UserDao.class, >> > > > UserDaoImpl.class).scope(ScopeConstants.PERTHREAD); >> > > > >> > > > The UserDao is used in setupRender and onActivate methods of my page >> > > (user >> > > > is an javax Entity): >> > > > >> > > > user = userDao.load(userId); >> > > > user.getBirthDate().toString() >> > > > >> > > > What's funny, if I use the Hibernate in the different way >> > > > >> > > > List<Object> birthDatesList = >> > userDao.getSession().createSQLQuery("select >> > > > birthdate from user where id = " + userId).list(); >> > > > java.sql.Timestamp birthDate = >> > > (java.sql.Timestamp)(birthDatesList.get(0)); >> > > > log.info("setupRender (birth date): " + birthDate.toString()); >> > > > >> > > > the returned date is correct. >> > > > >> > > > I also logged the birth dates of the other users, and the problem >> > occurs >> > > > only in the 28/03/1982 case. Have you ever noticed anything like >> that? >> > > > >> > > >> > >> > >