Ep, apparently you have no experience with writing applications spanning multiple time zones. I have. Your arguments are full of basic mistakes and nonsense (no offense meant). This is not your fault. Everybody was a beginner at some point. But working with time is a complex topic and it has always been a source of confusion. Please take a look here http://www.odi.ch/weblog/posting.php?posting=264 for an introduction. I'll take another approach to explain this to you. I consider it important that you as a Hibernate developer fully understand this.
The user's point of view is irrelevant in this discussion because: When I write an application, most of the time a TZ is not relevant in the business logic. So I can code everything using a Date object. When we need to display a date to a user or need the user to input a date, we always use a DateFormat initialized with the user's TZ. Should we need to perform calculations with dates that actually rely on a certain TZ we use a Calendar initialized with the right TZ. Once again, it is a programming error to assume anything else than GMT/UTC for Date.getTime/setTime. It is unnecessary and impossible to transport information about the user's TZ in a Date instance. The user's time zone usually is a local property and has no reason to be stored in the database. I will not talk about the user's TZ here any longer, because it is completely confined to the presentation layer. Now when I persist a Date object and retrieve it from the DB on a different server in a different TZ the Date object must still be the same. i.e. the Date object must represent the exact same point in time. There is no reason why information should change on the way to the DB and back! Compare this to storing distance information. Store the information "1 mile" in a DB in England and read it in Germany and get back "1.8 km". The distance is still the same, just expressed in different units. Getting back "1 km" in Germany would be wrong. Now when I store the information "the meeting starts at 2006-1-1 12h00 GMT" in England and read it in Germany I will get "the meeting starts at 2006-1-1 12h00 GMT+0100" which is "2006-1-1 11h00 GMT" and not the same information anymore. But this is what happens! Note the blatant difference to the distance example. In the distance example the actual information does not change. Only the representation is in different units. But in the Date example the actual information changes. Now the people in Germany will arrive one hour too early at the meeting. Note again: The Date class does not assume any units (TZ). So it is nonsense to say "this Date instance is in GMT+0200" or "convert a Date instance to a different TZ". A Date instance is the same everywhere and always denotes the same point in time. So where does this confusion come from? Popular DBs like Oracle do not store TZ information in DATE columns. But they do use a TZ dependent date format. For simplicity we assume a textual representation. So it is up to the DB user to interprete "2006-1-1 12h00" in the right time zone. This also means that the user is responsible to do a time zone conversion if necessary. The "user" here is the JDBC driver. JDBC offers setDate and getDate methods which accept an additional Calendar object. The Calendar object's TimeZone is used by the JDBC driver to convert the Date object to a DATE column. If no Calendar object is given it uses the VM's default time zone. This means when reading and writing Date objects through JDBC you have to make sure to always use the same TZ or you get wrong data. In system that span time zones it is therefore essential that all JDBC calls use the same TZ for JDBC. As their VM default time zone is not the same, the only way to achieve this is by passing a Calendar object to the JDBC setDate/getDate methods. Not doing so will always produce errors and destroy information in the end. The only reasonable "common" time zone is GMT. Some databases have TZ information associated with the "DB" and the DB connection. This TZ information may be used to do further conversion in certain cases. But this is completely vendor specific. So what is the EJB3 persistence layer doing wrong? - It does not pass a well-defined Calendar object to JDBC - It doesn't let the user define in which TZ Date objects are stored in the DB - It doesn't take into account the vendor specific implementations of the JDBC driver's Date / TZ handling Why is this a problem? Application developers give the responsibility of persistence to the persistence layer. With it they lose a lot of control about it. In this case the application programmer (me) has no way of fixing the misbehaviour on his side. What about Timestamp? When you look at the JDBC API you notice that there is no difference in handling Timestamp, Date and Calendar object. They are all converted to a certain time zone when stored in the DB. So it doesn't solve the problem. Timestamp is merely an extension of Date that supports nanoseconds. Nothing more. When you read the API Doc of the Timestamp class you understand why you don't want to use it: It causes problems when comparing it to Date objects. View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=3924528#3924528 Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=3924528 ------------------------------------------------------- This SF.net email is sponsored by: Splunk Inc. Do you grep through log files for problems? Stop! Download the new AJAX search engine that makes searching your log files as easy as surfing the web. DOWNLOAD SPLUNK! http://sel.as-us.falkag.net/sel?cmd=lnk&kid=103432&bid=230486&dat=121642 _______________________________________________ JBoss-user mailing list JBoss-user@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jboss-user