У меня есть таблица sqlite (v3) с этим определением столбца:
"timestamp" DATETIME DEFAULT CURRENT_TIMESTAMP
Сервер, на котором находится эта база данных, находится в часовом поясе CST. Когда я вставляю в свою таблицу, не включая столбец метки времени, sqlite автоматически заполняет это поле текущей меткой времени в GMT, а не в CST.
Есть ли способ изменить мой оператор вставки, чтобы сохранить сохраненную метку времени в CST? С другой стороны, вероятно, лучше сохранить его в GMT (например, на случай, если база данных будет перемещена в другой часовой пояс), поэтому есть ли способ изменить свой выбранный SQL для преобразования сохраненной метки времени в CST, когда я извлечь это из таблицы?
Ответы:
Я нашел в документации sqlite ( https://www.sqlite.org/lang_datefunc.html ) этот текст:
Это не выглядело так, как будто это соответствовало моим потребностям, поэтому я попытался немного изменить функцию datetime и закончил с этим:
Кажется, это работает - это правильный способ преобразования для вашего часового пояса или есть лучший способ сделать это?
источник
просто используйте местное время по умолчанию:
источник
Как правило, вы должны оставлять метки времени в базе данных в GMT и преобразовывать их только в / из местного времени при вводе / выводе, когда вы можете преобразовать их в локальную метку времени пользователя (а не сервера).
Было бы неплохо, если бы вы могли сделать следующее:
... для вывода метки времени пользователя по тихоокеанскому летнему времени. К сожалению, это не работает. Однако, согласно этому руководству по SQLite (прокрутите вниз до «Другие команды даты и времени»), вы можете запросить время, а затем одновременно применить смещение (в часах). Итак, если вы знаете смещение часового пояса пользователя, все в порядке.
Однако не имеет отношения к правилам перехода на летнее время ...
источник
В (признанном редком) случае, когда требуется локальное время данных (я, например, храню местное время в одной из своих баз данных, так как все, что меня волнует, это то, какое время дня было, и я не отслеживаю, где я был с точки зрения часовых поясов ...), вы можете определить столбец как
Часть% Y-% m-% dT% H:% M, конечно, необязательна; это то, как я хочу, чтобы мое время сохранялось. [Кроме того, если мое впечатление верное, в sqlite нет типа данных "DATETIME", поэтому на самом деле не имеет значения, используется ли TEXT или DATETIME в качестве типа данных в объявлении столбца.]
источник
Если столбец определен с помощью "
NOT NULL DEFAULT CURRENT_TIMESTAMP
," для вставленных записей всегда устанавливается время UTC / GMT.Вот что я сделал, чтобы не указывать время в моих операторах INSERT / UPDATE:
Проверьте, работает ли это ...
Надеюсь, это поможет.
источник
источник
SELECT datetime(CURRENT_TIMESTAMP, 'localtime')
источник
Вы также можете просто преобразовать столбец времени в метку времени с помощью strftime ():
Дает тебе:
Столбец таблицы timestamp может быть даже текстовым полем, используя
current_timestamp
как DEFAULT.Без strftime:
Дает тебе:
источник
Думаю, это может помочь.
источник
Текущее время в часовом поясе вашего компьютера:
Согласно http://www.sqlite.org/lang_datefunc.html
источник
Time ( 'now', 'localtime' )
и Дата( 'now', 'localtime' )
работает.источник