Если приведение не выполнено, ключевое слово «as» не вызывает исключение; вместо этого он устанавливает переменную в null (или в ее значение по умолчанию для типов значений).
Теперь мое требование заключается в том, чтобы оно сохраняло значение в GMT / UTC независимо от часового пояса JVM. Есть ли способ установить часовой пояс на лету, а затем сбросить его, как только я закончу с JDBC?
Правка: Хорошо, я нашел способ обойти эту проблему. Сделал следующее
TimeZone default = TimeZone.getDefault();
try
{
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
//Do stuff with JDBC
}
finally
{
TimeZone.setDefault(default);
}
Спекуляция тупая. Java.util.Date хранит миллисекунды с эпохи в системе отсчета GMT. Java.sql.Timestamp - это дата плюс наносекунды в той же системе отсчета. Все недешевые методы получения и установки используют систему отсчета GMT. Для любого вида здравомыслия часовой пояс по умолчанию для хранения метки времени должен быть GMT.
В многоуровневом приложении внешний интерфейс, драйвер и сервер базы данных могут находиться в разных часовых поясах. Некоторые из уровней могут быть в разных часовых поясах одновременно; например, если вы выполняете балансировку нагрузки через Интернет на континенте или если у вас есть мобильное приложение, подключающееся к центральному серверу. Облачная операционная среда была бы во многом таким же сценарием, когда вы не знаете, где будет работать драйвер JDBC, и не можете гарантировать, что он никогда не изменится.
Единственный способ, которым я знаю для достижения согласованности в этих средах, - это использовать только набор параметров и метод ResultSet, которые принимают Календарь, и убедиться, что каждое приложение, которое обращается к данным, использует какой-то календарь, предпочтительно GMT или UTC.