Это работает, если вам нужен только общий файл с простым 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);
}
});
Хотя это явно не указано для setTimestamp(int parameterIndex, Timestamp x)
, драйверы должны следовать правилам, установленным setTimestamp(int parameterIndex, Timestamp x, Calendar cal)
javadoc :
Устанавливает назначенный параметр в заданное значение
blockquote>java.sql.Timestamp
, используя данный объектCalendar
. Драйвер использует объектCalendar
для построения значения SQLTIMESTAMP
, которое затем отправляет драйвер в базу данных. С помощью объекта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)
с экземпляром календаря в требуемом часовом поясе. Просто убедитесь, что вы также используете эквивалентный геттер с тем же часовым поясом, когда получение значений (если вы seTIMESTAMP
без информации о часовом поясе в вашей базе данных).Итак, если вы хотите сохранить фактический часовой пояс GMT, вам нужно использовать:
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); stmt.setTimestamp(11, tsSchedStartTime, cal);
С JDBC 4.2 совместимый драйвер должен поддерживать
java.time.LocalDateTime
(иjava.time.LocalTime
) дляTIMESTAMP
(иTIME
) черезget/set/updateObject
. Классыjava.time.Local*
не имеют временных зон, поэтому преобразование не требуется (хотя это может открыть новый набор проблем, если ваш код действительно принял определенный часовой пояс).
Для Mysql у нас есть ограничение. В драйвере Mysql doc мы имеем:
Ниже приведены некоторые известные проблемы и ограничения для MySQL Connector / J: Когда Connector / J извлекает временные метки для перехода на летнее время (DST), используя метод getTimeStamp () в наборе результатов, некоторые из возвращаемых значений могут быть неправильными. Ошибок можно избежать, используя следующие параметры подключения при подключении к базе данных:
blockquote>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.
Я думаю, правильный ответ должен быть 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.
Он специфичен для вашего драйвера. Вам необходимо указать параметр в вашей программе 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')
Может также быть полезным в правильно обрабатывая преобразование. Взято из здесь