У постгресах timestamp with time zone
можна скоротити як timestamptz
і, timestamp without time zone
як timestamp
. Я буду використовувати короткі назви типів для простоти.
Отримати часову позначку Unix з постгресів, timestamptz
як now()
, як ви кажете, просто:
select extract(epoch from now());
Це дійсно все, що потрібно знати про отримання абсолютного часу від будь-якого типу timestamptz
, в тому числі now()
.
Речі ускладнюються лише тоді, коли у вас є timestamp
поле.
Коли ви вводите timestamptz
такі дані, як now()
це поле, спочатку вони будуть перетворені на певний часовий пояс (або явно з at time zone
перетворенням в часовий пояс сеансу), і інформація про часовий пояс буде відкинута . Це вже не стосується абсолютного часу. Ось чому ви, як правило, не хочете зберігати часові позначки як timestamp
і зазвичай використовуєте timestamptz
- можливо, фільм виходить о 18:00 у певну дату в кожному часовому поясі , це такий вигляд використання.
Якщо ви коли-небудь працюєте в одному часовому поясі, ви можете уникнути (неправильно) використання timestamp
. Перетворення назад в timestamptz
достатньо розумне, щоб впоратися з DST, і часові позначки для цілей перетворення передбачаються у поточному часовому поясі. Ось приклад для GMT / BST:
select '2011-03-27 00:59:00.0+00'::timestamptz::timestamp::timestamptz
, '2011-03-27 01:00:00.0+00'::timestamptz::timestamp::timestamptz;
/*
|timestamptz |timestamptz |
|:---------------------|:---------------------|
|2011-03-27 00:59:00+00|2011-03-27 02:00:00+01|
*/
DBFiddle
Але зверніть увагу на таке заплутане поведінку:
set timezone to 0;
values(1, '1970-01-01 00:00:00+00'::timestamp::timestamptz)
, (2, '1970-01-01 00:00:00+02'::timestamp::timestamptz);
/*
|column1|column2 |
|------:|:---------------------|
| 1|1970-01-01 00:00:00+00|
| 2|1970-01-01 00:00:00+00|
*/
DBFiddle
Це тому, що :
PostgreSQL ніколи не вивчає вміст прямої рядка перед визначенням її типу, і тому буде трактувати обидві […] як часові позначки без часового поясу. Щоб переконатися, що літерал трактується як часова марка з часовим поясом, надайте йому правильний явний тип… У буквальному сенсі, визначеному як часова мітка без часового поясу, PostgreSQL мовчки ігнорує будь-яку вказівку часового поясу