useTimezone е по-старо решение. Екипът на MySQL пренаписа setTimestamp/getTimestamp кода сравнително наскоро, но той ще бъде активиран само ако зададете параметъра на връзката useLegacyDatetimeCode=false и използвате най-новата версия на mysql JDBC конектор. Така например:
String url =
"jdbc:mysql://localhost/mydb?useLegacyDatetimeCode=false
Ако изтеглите изходния код на mysql-connector и погледнете setTimestamp, е много лесно да видите какво се случва:
Ако използвате наследен код за дата и време =false, се извиква newSetTimestampInternal(...). След това, ако календарът, предаден на newSetTimestampInternal, е NULL, вашият обект за дата се форматира в часовата зона на базата данни:
this.tsdf = new SimpleDateFormat("''yyyy-MM-dd HH:mm:ss", Locale.US);
this.tsdf.setTimeZone(this.connection.getServerTimezoneTZ());
timestampString = this.tsdf.format(x);
Много е важно Календарът да е нулев - така че се уверете, че използвате:
setTimestamp(int,Timestamp).
... НЕ setTimestamp(int,Timestamp,Calendar).
Сега трябва да е ясно как работи това. Ако създадете дата:5 януари 2011 г. 3:00 ч. в Америка/Лос_Анджелес (или каквато часова зона искате) с помощта на java.util.Calendar и извикате setTimestamp(1, myDate), тогава тя ще вземе вашата дата, използвайте SimpleDateFormat за да го форматирате в часовата зона на базата данни . Така че, ако вашата БД е в America/New_York, тя ще изгради низа '2011-01-05 6:00:00', който да бъде вмъкнат (тъй като Ню Йорк изпреварва LA с 3 часа).
За да извлечете датата, използвайте getTimestamp(int) (без календара). Отново ще използва часовата зона на базата данни, за да изгради дата.
Забележка:Часовата зона на уеб сървъра вече е напълно без значение! Ако не зададете useLegacyDatetimecode на false, часовата зона на уеб сървъра се използва за форматиране – добавя много объркване.
Забележка:
Възможно е MySQL да се оплаквам, че часовата зона на сървъра е двусмислена. Например, ако вашата база данни е настроена да използва EST, може да има няколко възможни EST часови зони в Java, така че можете да изясните това за mysql-connector, като му кажете точно каква е часовата зона на базата данни:
String url =
"jdbc:mysql://localhost/mydb?useLegacyDatetimeCode=false&serverTimezone=America/New_York";
Трябва да направите това само ако се оплаква.