java.sql.Timestamp.getTime (), похоже, изменяет значение, основанное на часовом поясе [duplicate]

Это работает, если вам нужен только общий файл с простым URL-адресом. Обратите внимание, что это может привести к отмене ваших правил хранения Firebase.

bucket.upload(file, function(err, file) {
    if (!err) {
      //Make the file public
      file.acl.add({
      entity: 'allUsers',
      role: gcs.acl.READER_ROLE
      }, function(err, aclObject) {
          if (!err) {
              var URL = "https://storage.googleapis.com/[your bucket name]/" + file.id;
              console.log(URL);
          } else {
              console.log("Failed to set permissions: " + err);
          }
      });  
    } else {
        console.log("Upload failed: " + err);
    }
});
63
задан Hunsu 30 June 2015 в 14:59
поделиться

4 ответа

Хотя это явно не указано для setTimestamp(int parameterIndex, Timestamp x), драйверы должны следовать правилам, установленным setTimestamp(int parameterIndex, Timestamp x, Calendar cal) javadoc :

Устанавливает назначенный параметр в заданное значение java.sql.Timestamp, используя данный объект Calendar. Драйвер использует объект Calendar для построения значения SQL TIMESTAMP, которое затем отправляет драйвер в базу данных. С помощью объекта Calendar драйвер может вычислять временную метку с учетом пользовательского часового пояса. Если объект Calendar не указан, драйвер использует часовой пояс по умолчанию, который используется для виртуальной машины, на которой запущено приложение.

Когда вы звоните с помощью setTimestamp(int parameterIndex, Timestamp x), драйвер JDBC использует часовой пояс виртуальной машины для расчета даты и времени временной метки в этом часовом поясе. Эта дата и время - это то, что хранится в базе данных, и если столбец базы данных не хранит информацию о часовом поясе, тогда любая информация о зоне теряется (что означает, что она зависит от приложения (ов), использующего базу данных, чтобы использовать (например, сохранить в отдельной колонке).

Например: Ваш часовой пояс GMT + 2. Вы сохраняете «2012-12-25 10 : 00: 00 UTC ". Фактическое значение, хранящееся в базе данных, -« 2012-12-25 12:00:00 ». Вы возвращаете его снова: вы возвращаете его снова как« 2012-12-25 10:00:00 UTC "(но только если вы извлечете его с помощью getTimestamp(..)), но когда другое приложение обратится к базе данных в часовом поясе GMT ​​+ 0, оно будет получать временную метку как« 2012-12-25 12:00:00 UTC ».

Если вы хотите сохранить его в другом часовом поясе, вам нужно использовать setTimestamp(int parameterIndex, Timestamp x, Calendar cal) с экземпляром календаря в требуемом часовом поясе. Просто убедитесь, что вы также используете эквивалентный геттер с тем же часовым поясом, когда получение значений (если вы se TIMESTAMP без информации о часовом поясе в вашей базе данных).

Итак, если вы хотите сохранить фактический часовой пояс GMT, вам нужно использовать:

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
stmt.setTimestamp(11, tsSchedStartTime, cal);

С JDBC 4.2 совместимый драйвер должен поддерживать java.time.LocalDateTimejava.time.LocalTime) для TIMESTAMPTIME) через get/set/updateObject. Классы java.time.Local* не имеют временных зон, поэтому преобразование не требуется (хотя это может открыть новый набор проблем, если ваш код действительно принял определенный часовой пояс).

90
ответ дан Mark Rotteveel 25 August 2018 в 00:19
поделиться

Для Mysql у нас есть ограничение. В драйвере Mysql doc мы имеем:

Ниже приведены некоторые известные проблемы и ограничения для MySQL Connector / J: Когда Connector / J извлекает временные метки для перехода на летнее время (DST), используя метод getTimeStamp () в наборе результатов, некоторые из возвращаемых значений могут быть неправильными. Ошибок можно избежать, используя следующие параметры подключения при подключении к базе данных:

useTimezone=true
useLegacyDatetimeCode=false
serverTimezone=UTC

Итак, когда мы не используем эти параметры, и мы вызываем setTimestamp or getTimestamp с календарем или без календарь, мы имеем временную метку в часовом поясе jvm.

Пример:

Часовой пояс jvm - GMT + 2. В базе данных есть временная метка: 1461100256 = 19/04/16 21: 10: 56,000000000 GMT

Properties props = new Properties();
props.setProperty("user", "root");
props.setProperty("password", "");
props.setProperty("useTimezone", "true");
props.setProperty("useLegacyDatetimeCode", "false");
props.setProperty("serverTimezone", "UTC");
Connection con = DriverManager.getConnection(conString, props);
......
Calendar nowGMT = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
Calendar nowGMTPlus4 = Calendar.getInstance(TimeZone.getTimeZone("GMT+4"));
......
rs.getTimestamp("timestampColumn");//Oracle driver convert date to jvm timezone and Mysql convert date to GMT (specified in the parameter)
rs.getTimestamp("timestampColumn", nowGMT);//convert date to GMT 
rs.getTimestamp("timestampColumn", nowGMTPlus4);//convert date to GMT+4 timezone

Первый метод возвращает: 1461100256000 = 19/04/2016 - 21:10 : 56 GMT

Второй метод возвращает: 1461100256000 = 19/04/2016 - 21:10:56 GMT

Третий метод возвращает: 1461085856000 = 19/04/2016 - 17 : 10: 56 GMT

Вместо Oracle, когда мы используем одни и те же вызовы, имеем:

Первый метод возвращает: 1461093056000 = 19/04/2016 - 19:10: 56 GMT

Второй метод возвращает: 1461100256000 = 19/04/2016 - 21:10:56 GMT

Третий метод возвращает: 1461085856000 = 19/04/2016 - 17: 10:56 GMT

Примечание: Нет необходимости указывать параметры для Oracle.

4
ответ дан Abdelhafid 25 August 2018 в 00:19
поделиться

Я думаю, правильный ответ должен быть java.sql.Timestamp не является специфичным для часового пояса. Временная метка представляет собой составную часть java.util.Date и отдельную наносекунду. В этом классе нет информации о часовом поясе. Таким образом, так же, как Date, этот класс просто содержит миллисекунды с 1 января 1970 года, 00:00:00 GMT + nanos.

В PreparedStatement.setTimestamp (int parameterIndex, Timestamp x, Calendar cal) Календарь используется драйвером для изменения часовой пояс по умолчанию. Но Timestamp по-прежнему занимает миллисекунды в GMT.

API неясно, как именно JDBC-драйвер должен использовать Calendar. Провайдеры, похоже, не знают, как их интерпретировать, например. последний раз, когда я работал с MySQL 5.5 Calendar, драйвер просто игнорировал Calendar как в PreparedStatement.setTimestamp, так и в ResultSet.getTimestamp.

24
ответ дан Evgeniy Dorofeev 25 August 2018 в 00:19
поделиться

Он специфичен для вашего драйвера. Вам необходимо указать параметр в вашей программе Java, чтобы указать ему часовой пояс, который вы хотите использовать.

java -Duser.timezone="America/New_York" GetCurrentDateTimeZone

Далее:

to_char(new_time(sched_start_time, 'CURRENT_TIMEZONE', 'NEW_TIMEZONE'), 'MM/DD/YY HH:MI AM')

Может также быть полезным в правильно обрабатывая преобразование. Взято из здесь

5
ответ дан Woot4Moo 25 August 2018 в 00:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: