gmdate — Форматирует датувремя по Гринвичу


Содержание

Как получить среднее время по Гринвичу в PHP?

У меня есть сервер, который настроен на EST, и все записи в базе данных установлены в EST. Я хотел бы знать, как установить его в GMT. Я хочу предложить пользователям часового пояса.

Независимо от того, в какой часовой области GMT находится сервер, здесь очень простой способ получить время и дату для любого часового пояса. Это делается с помощью функций time() и gmdate() . Функция gmdate() обычно дает нам время по Гринвичу, но, делая трюк с помощью функции time() , мы можем получить GMT + N или GMT-N, что означает, что мы можем получить время для любой часовой пояс GMT.

Например, если вам нужно получить время для GMT + 5, вы можете сделать это следующим образом

Теперь, если вам нужно получить время для GMT-5, вы можете просто вычесть смещение из time() вместо добавления к нему, например, в следующем примере, где мы получаем время для GMT-4

Я настоятельно рекомендую избегать возиться с отметками времени UNIX, чтобы сделать его похожим на другой часовой пояс. Это урок, который я усвоил, слишком много раз.

Временная метка — это количество секунд с полуночи 1 января 1970 года по Гринвичу. Неважно, где вы находитесь в мире, данная метка времени представляет собой тот же самый момент времени, независимо от часовых поясов. Да, отметка времени «0» означает 10 утра 1/1/70 в Австралии, Midnight 1/1/70 в Лондоне и 17:00 31/12/69 в Лос-Анджелесе, но это не означает, что вы можете просто добавить или вычесть значения и гарантировать точность.

Золотой пример, который наполнял меня каждый год слишком долго, заключался в том, что когда наступит летнее сбережение. Переход на летнее время означает, что существуют «часы», которые не существуют в некоторых частях мира. Например, в большинстве районов США 2 апреля 2006 года не было 2:01 утра.

Достаточно квазиразборчивое разглагольствование. Мой совет — хранить ваши даты в базе данных как временные метки, а затем.

  • Если вам нужно локальное время на сервере, используйте date()
  • Если вам нужно получить GMT, используйте gmdate()
  • Если вам нужен другой часовой пояс, используйте date_default_timezone_set() , а затем date()

Это сохранит ваши ценности в чистоте (вам не нужно беспокоиться о добавлении смещений, а затем вычитать перед сохранением), он будет соблюдать все правила перехода на летнее время, и вам также не нужно даже искать часовой пояс места, которое вы хотите.

Как отформатировать дату и время по Гринвичу независимо от региональных настроек?

У меня есть дата, хранящееся в базе данных как GMT. Мне нужно отформатировать это datetime как строку вместе со смещением часового пояса к UTC, например:

2012-03-15T12: 49: 23,000 + 00: 00

Этот код работает на моей машине в Великобритании. Когда я меняю региональные настройки на другой часовой пояс, например Перт, я получаю следующий результат:

2012-03-15T12: 49: 23,000 + 08: 00

Мне нужен вывод строки, чтобы всегда представлять время в GMT.

Это неудобно. Сначала вам нужно проанализировать его соответствующим образом, а затем отформатировать его соответствующим образом. проще всего пройти через DateTimeOffset . (Я предполагаю, что вы намерены вводить строку ввода, как если бы она была в UTC? Вы не поняли это.)

ТЛ; др

Ответа на этот вопрос Damilola правильно, предполагая использовать рамки java.time встроенный в Java 8 и более поздних версий. Но этот Ответ использует ZonedDateTime класс, который является избыточным, если вы просто хотите использовать UTC, а не какой-либо конкретный часовой пояс.

Проблемные старые классы даты и времени теперь унаследованы, заменены классами java.time.

Instant

Instant Класс представляет собой момент на временной шкале в формате UTC с разрешением наносекунд (до девяти (9) цифр десятичной дроби).

instant.toString (): 2020-11-29T23: 18: 14.604Z

Вы можете думать Instant как строительный блок, к которому вы можете добавить часовой пояс ( ZoneID ), чтобы получить ZonedDateTime .

О java.time

Java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытеснять неприятные старые устаревшие классы даты и времени , такие как java.util.Date , Calendar , и SimpleDateFormat .

Проект Joda-Time , находящийся сейчас в режиме обслуживания , рекомендует перейти на java.time.

Чтобы узнать больше, смотрите Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .

Где взять классы java.time?

  • Java SE 8 иSE 9 и позже
    • Встроенный.
    • Часть стандартного Java API с комплексной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 иSE 7
    • Большая часть функциональности java.time перенесена на Java 6 и 7 в ThreeTen-Backport .
  • Android
    • Проект ThreeTenABP адаптирует ThreeTen-Backport (упомянутый выше) специально для Android.
    • См Как использовать . .

Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Вы можете найти некоторые полезные классы здесь , такие как Interval , YearWeek , YearQuarter , и более .

плюса

1386 Репутация автора

Ниже приведены полезные методы Utils для управления временем в GMT с помощью DST Savings:

Автор: Kalpesh Размещён: 29.11.2020 01:20

плюса

431 Репутация автора

После Java 8 вы можете получить отформатированное время, как показано ниже:

плюса

34698 Репутация автора

Ты не можешь

Во-первых, вы спрашиваете о невозможном. Старомодный Date объект не получил, так как не может иметь часовой пояс или смещение по Гринвичу.

Но дата всегда интерпретируется в моем местном часовом поясе.


Я предполагаю, что вы напечатали Date или сделали что-то еще, что неявно вызывает его toString метод. Я считаю, что это единственный раз, когда Date интерпретируется в вашем часовом поясе. Точнее в текущем часовом поясе по умолчанию вашей JVM. С другой стороны, это неизбежно. Date.toString() ведет себя таким образом, он выбирает настройку часового пояса JVM и использует ее для рендеринга возвращаемой строки.

Вы можете с java.time

Вы не должны использовать Date , хотя. Этот класс плохо спроектирован и, к счастью, давно устарел. Также java.time, современный Java-API даты и времени, который заменяет его, имеет один или два класса для даты и времени со смещением от GMT или UTC. Я считаю GMT и UTC синонимами, строго говоря, это не так.

Когда я только что запустил этот фрагмент, результат был:

Время в UTC (GMT): 2020-06-17T11: 51: 38.246188Z

PHP конвертировать даты и времени по Гринвичу

Я нуждается в простой способ для преобразования времени, даты штамп в формате UTC (от того, что часовой пояс сервер в) Будем надеяться, без использования каких-либо библиотек.

Используйте StrToTime для создания метки из заданной строки (трактуемой как локальное время) и использовать gmdate , чтобы получить его как отформатированный дату UTC назад.

пример

В соответствии с просьбой, вот простой пример:

(Но это использовать класс)

Без каких-либо классов, которые вы могли бы попробовать что-то вроде этого:

Примечание: Возможно, вам потребуется установить часовой пояс обратно к оригиналу, а также

Делайте это так:

чтобы получить «СЕЙЧАС» в формате UTC.

Если у вас есть дата в этом формате YYYY-MM-HH дд: мм: сс, вы можете обмануть PHP, добавив UTC в конце вашей «дата и время строки» и использовать StrToTime, чтобы преобразовать его.

Это будет печатать это:

И как вы можете видеть, что заботится о проблеме перехода на летнее время, а также.

Немного странный способ решить . :)

Как StrToTime требует определенного формата входного сигнала, DateTime :: createFromFormat может быть использован ( требуется PHP 5.3+ )

Я когда-то использовать этот метод:

Работает все MOST времени.

Преобразовать строку местного часового пояса в UTC строку.
например , Новая Зеландия Время зоны

  • NZDT: UTC + 13: 00 ,
    если $ DateTime = «2020-02-01 00:00:01», $ выход = «2020-01-31 11:00:01»;
    если $ DateTime = «2020-02-29 23:59:59», $ выход = «2020-02-29 10:59:59»;
  • NZST: UTC + 12: 00 ,
    если $ DateTime = «2020-05-01 00:00:01», $ выход = «2020-04-30 12:00:01»;
    если $ DateTime = «2020-05-31 23:59:59», $ выход = «2020-05-31 11:59:59»;

С PHP 5 или выше, вы можете использовать DateTime :: формат функции (см документации http://us.php.net/manual/en/datetime.format.php )

в качестве альтернативы вы можете попробовать это:

этот выход будет:

Вы можете использовать это в атрибуте валютирования ввода текста, если вы хотите, чтобы отобразить только для чтения даты.

удалить «е», если вы не хотите, чтобы показать свой регион / страну.

В качестве улучшения на ответ Phill Pafford в (я не понял его «YD-MTG: Я: SZ» , и он предложил вернуться часовой пояс). Поэтому я предлагаю это (я осложнена изменения формата HMTL в виде простого текста / . ):

Общего назначения Функция нормализации форматировать любую временную метку из любого часового пояса в другой. Очень полезно для хранения datetimestamps пользователей из разных часовых поясов в реляционной базе данных. Для сравнения базы данных магазина метки времени как UTC и использовать с gmdate(‘Y-m-d H:i:s’)

Применение:

эхо даты ( ‘F D Y’, StrToTime ( ‘2010-01-19 00:00:00’));

Вы должны изменить формат времени, чтобы увидеть другой выход

Если вы не возражаете против использования в PHP DateTime класс, который был доступен , начиная с PHP 5.2.0, то существует несколько сценариев , которые могут поместиться вашей ситуации:

Если у вас есть $givenDt объект DateTime , который вы хотите преобразовать в UTC , то это будет преобразовать его в UTC:

Если вам нужен оригинал $givenDt позже, вы можете альтернативно хотите клонировать данный объект DateTime перед преобразованием клонированного объекта:

Если у вас есть только строка времени — даты, например $givenStr = ‘2020-12-17 10:47:12’ , то вы сначала создать объект типа DateTime, а затем преобразовать его. При этом предполагается , что $givenStr в сконфигурированной часовом поясе PHP.

Если данная строка времени — даты в какой — то часовой пояс отличается от того, в конфигурации PHP, а затем создать объект типа DateTime, поставляя правильный часовой пояс (см список часовых поясов PHP поддерживает ). В этом примере мы предполагаем , местный часовой пояс в Амстердаме:

Работа с датой и временем в PHP

Очевидно, что очень часто программистам приходится работать с датой и временем. Самый простой пример — это дата и время отправки сообщения на форуме. И, разумеется, такие вещи могут реализоваться на PHP, тем более, что возможностей по работе с датой и временем в PHP очень много.

Базовая функция, связанная с датой и временем в PHP, — это функция time(), которая возвращает количество секунд, прошедших с полуночи 01.01.1970 (зарождение эпохи Unix):

Запустив данный скрипт, Вы узнаете, сколько секунд прошло с полуночи 01.01.1970 до момента вызова функции time() в Вашем скрипте.

Разумеется, помимо этой базовой функции, которая присутствует во всех языках программирования, где можно работать с датой и временем (по крайней мере, среди тех, которые я знаю), существует и другая функция, которая называется getdate():

Запустив данный скрипт, Вы увидите набор ключей в массиве и их соответствующих значений (заодно, повторили конструкцию foreach). Думаю, что теперь для Вас не составит труда узнать любые данные, связанные с датой и временем. Например, чтобы вывести текущее время, необходимо написать следующий код:

Также у функции getdate() существует необязательный параметр, который означает количество секунд, прошедших с полуночи 01.01.1970. Он сделан для того, чтобы эта функция могла возвращать не только текущие время и дату, а, вообще говоря, любые:

В результате, Вы увидите 1974-ый год.

Также существует функция date(). Я рекомендую посмотреть описание по ней в справочнике, так как данная функция принимает весьма сложный параметр, который задаёт формат вывода даты. Элементов форматирования чуть больше 30-ти штук. И в примере ниже я приведу несколько из них, а остальные посмотрите в справочнике, потому что их запоминать не нужно, но ознакомиться с ними крайне желательно. А принцип их использования знать обязательно, и о нём следующий пример:

В результате, Вы увидите что-то наподобие этого: «Сегодня 15.11.2010 21:44:24«. Также у функции date() есть ещё второй необязательный параметр, задающий timestamp, как раз та величина, равная количеству секунд, прошедших с полуночи 01.01.1970. Пример использования второго параметра:

Также существует функция gmdate(), которая является полным аналогом функции date(), но функция gmdate() показывает время не по часовому поясу сервера, на котором работает скрипт, а по Гринвичу. Очевидно, что с помощью этой функции надо сохранять всю информацию о дате и времени, которую видит пользователь, а при выводе нужно подстраиваться под часовой пояс каждого пользователя (в идеале, конечно):


В результате, Вы увидите примерно следующее: «Mon Nov 15 18:52:45 GMT 2010«. Разумеется, у Вас будет выведена уже другая дата, но в аналогичном формате. Также я настоятельно рекомендую залезть в справочник и просто ознакомиться с другими элементами даты и времени в PHP (я привёл только треть), так как функции date() и gmdate() — это самый простой и самый быстрый способ получить дату и время в практически любом формате.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Она выглядит вот так:

  • BB-код ссылки для форумов (например, можете поставить её в подписи):
  • Комментарии ( 7 ):

    Я всё понимаю, что с датой работать очень легко, но всё таки — напишите статью как сделать дату для каждого пользователя правильной, ни одной статьи про это нету, лазил 4 часа непрерываясь в поисках ответа на этот вопрос, 92 страницы в гугле обошёл и не нашёл, Пожалуйста напишите про это статью, так как у меня люди на сайте из разных стран, а время даже не моеё страны, совсем другой, которая на 6 часов больше моего времени. а я живу в Украине. напишите статью очень вас прошу

    Да, Михаил, меня тоже очень интересует этот вопрос! Хотелось бы статью! Спасибо!

    Хорошо, через 1-2 недели будет такая статья.

    Спасибо большое, жду с нетерпением!

    А можно адрес этой статьи (если она уже есть)?

    Здравствуйте ! А как вычитать минуты ? К примеру у меня есть две переменные в минутах: $start = 35; $now = date(«i»); Нужно вычесть из $now-$start чтобы получилось правильно а то не получается . (

    Для добавления комментариев надо войти в систему.
    Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.

    Илон Маск рекомендует:  Оптимизация для pentium процессора планирование операций с плавающей точкой

    Copyright © 2010-2020 Русаков Михаил Юрьевич. Все права защищены.

    Gmdate — Форматирует дату/время по Гринвичу

    Ничто не постоянно, даже время :) Особенно если речь идет о времени в PHP/MySQL. Когда я первый раз столкнулся с проблемой преобразования времени в PHP, я долго копался в мануалах и инете, но ни как не мог поймать суть. В итоге я все же нашел свою ошибку, все подробно для себя описал в txt-файле и забыл. Сейчас (спустя полтора года) опять возникли запарки, поднимаю текстовик.. и ничего не могу разобрать. Пришло время систематизировать записи про время (вот такой каламбурчик ;))

    Время в PHP
    Установка временной зоны (часового пояса)

    Узнать как правильно пишется нужная временная зона можно так: Получим полный список временных зон, зашитый в текущюю сборку php. я для примеров беру временную зону Asia/Irkutsk (GMT+8:00). Кстати, нулевой часовой пояс в программах обозначается «GMT«.

    Установка временной зоны php.ini : date.timezone = «Asia/Irkutsk» Установка временной зоны .htaccess : php_value date.timezone «Asia/Irkutsk»

    Unix-системы при выполнении скриптов могут определять текущее время на основе указанного местоположения через переменную окружения TZ (имеются в виду переменные окружения скрипта). При этом учитывается перевод часов на летнее время. Установка через переменную окружения в .htaccess : SetEnv TZ Asia/Irkutsk Установка переменной окружения через PHP (работает так же в Win-системах):

    Начиная с 5-х версий PHP есть такая функция (ее вызов установит временную зону для скрипта на время его выполнения):

    Функции

    После установки временной зоны функции типа date(), localtime() и т.д. будут возвращать значения с учетом установленной временной зоны.

    Какая бы временная зона не была, функция gmdate() возвращает дату/время по Гринвичу, т.е. GMT+0:0 (вообще так не пишется, для понятности приписал «+0:0»). Функция time() возвращает возвращает текущую метку времени Unix (формат UTC, timestamp) не зависимо от установленного часового пояса. Форматы времени GMT и UTC — абсолютные и используются, как эталоны отсчета даты/времени. Разница между ними в том, что:

    • GMT считает дату/время от рождества Христова (от начала эпохи). Данные представляются примерно как dd.mm.yyyy hh:mm:ss (в развисимости от региональных настроек)
    • UTC считает от 1 января 1970 00:00:00 GMT (от начала эпохи Unix). Данные представляются числом секунд, прошедших с точки отчета (больше целое число)

    Собственно, любые функции конвертации форматов GMT UTC корректно все это учитывают и переводят. Итак, можно считать GMT/UTC за абсолютное значение времени.

    Когда я разбирался в разнице функций, я запускал скрипты на localhost (на локальном компе с PHP-машиной). Так вот PHP у меня работал в нулевом часовом поясе, т.е. по Гринвичу! Поэтому не было разницы в возращаемых значениях функций даты/времени, и поэтому до меня не доходил смысл справок по этим функциям. После явного указания часового пояса все встало на свои места.

    Вот этот код должен показать, как все происходит со временем в разных функциях:

    Вот здесь всплывает еще один интересный момент: разница во времени 9 часов, хотя часовой пояс устанавливается +8 часов. Все потому, что хитрые функции вполне корректно воспринимают перевод на летнее/зимнее время.

    Замечание: если временная зона не установлена в настройках PHP-машины (основной php.ini), не задается нигде в настройках для сайта (php.ini или .htaccess сайта), а также не определяется функциями в скрипте, то при вызове функции date() получишь «Warning: date() It is not safe to rely on the system’s timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. . «. В двух словах, это требование явного указания временной зоны =). А вот если при этом еще и сообщения типа E_WARNING отключены, тогда ошибок не увидишь и будешь потом голову ломать, почему все функции одинаковое время показывают и почему php работает в нулевом поясе ;) Вот у меня как раз был самый тяжелый случай.

    Маски для date() и strftime(). Вторая функция использует функции системы, поэтому не все форматирующие символы работают. Например, Винда не признает %e (дни месяца без ведущих нулей), вместо этого можно использовать %#d. Символ # говорит о том, что ведущие нули нужно удалять. Но это работает только в Windows, фиг его знает, как на Линухе будет исполняться тот же код. С другой стороны date() все форматирует, но без учета локали, т.е. названия дней и месяцев на английском.

    Мое заблуждение о возможностях функции setlocale(). Она устанавливает/показывает локаль выполнения скрипта. В частности установит форматирование даты в представлении русского языка. А это значит, что название месяцев, последовательность чисел в записи даты будет идти по правилам, принятым в России. Только и всего. Установка локали не устанавливает часовой пояс для скрипта или сервера.

    Время в MySQL
    Корректная установка временной зоны в MySQL

    (по материалам мануала «MySQL Server Time Zone Support»)
    В дистрибутиве MySQL под Windows таблицы с временными зонами — пустые. Их нужно отдельно cкачать здесь. Сейчас по ссылке доступны для скачивания два варианта «POSIX standard Time, 2010» и «Time zone with leap seconds, 2010«. Разница в том, что второй вариант учитывает еще одно смещение — «cекунды координации«. Смысл примерно следующий: 61-ая секунда называется leap second и добавляется она в UTC-время раз в несколько лет либо 30 июня, либо 31 декабря. Такая корректировка вызвана замедляющимся вращением Земли. По состоянию на 2010 год во время добавлено 23 секунды. Подробнее об этом можно почитать на Википедии

    Наконец скачанные таблицы нужно скопировать в каталог [. /Mysql/data/mysql] и перезапустить MySQL-сервер.

    Ахтунг! Для nix-подобных систем существует иная процедура, рекомендуемая тут, см. раздел «Populating the Time Zone Tables». Суть сводится примерно к такой вот команде:

    $ mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -uroot -p mysql

    Утилита прочитает информацию по часовым поясам, хранящуюся в системе и заполнит нужную таблицу. Не без косяков, но это лучше, чем ничего.

    Получить список зон можно, например, таким запросом (выбор по Азии): mysql> SELECT `name` FROM `mysql`.`time_zone_name` WHERE `name` LIKE ‘Asia%’; Следующий запрос устанавливает временную зону на всем сервере. Не рекомендую так делать. mysql> SET GLOBAL time_zone = ‘Asia/Irkutsk’; Откатиться можно так (значение ‘SYSTEM‘ указывает на то, что зона должна быть та же, что и временная зона в ОС): mysql> SET GLOBAL time_zone = ‘SYSTEM’; Установка временной зоны для текущей сессии. Вполне нормальный подход mysql> SET SESSION time_zone = ‘Asia/Irkutsk’; Проверить установки зон сервера и сессии можно так (в ответе должно быть то, что установили): mysql> SELECT @@global.time_zone, @@session.time_zone; Пример:

    Если на MySQL-сервере не загружены таблицы с временными зонами, то все равно можно установить временную зону, при этом указывать ее нужно числом. Например, сместить время сессии +5 часов: mysql> SET SESSION time_zone = ‘+5:00’;

    Здесь есть слабое место: когда вы указываете часовой пояс «словами», MySQL читает смещение из таблицы временных зон и учитывает переход на летнее время, а если явно задать число, то естественно ни какого учета не происходит. Не забывайте об этом.

    TIMESTAMP


    Где-то вычитал, что timestamp в MySQL — это не тоже самое, что TIMESTAMP в Unix, т.е. отличается от универсального времени (UTC). Проверил — фигня все это. Есть в БД поле формата ‘timestamp‘. Если явно в него что-то не пишется, до при добавлении/изменении записи в него пишется именно абсолютное UTC-время. В упомянутом выше мануале сказано примерно следующее:
    «Установка временной зоны для сессии влияет только на вывод данных в ней. При записи времени в базу значение сначала переводится в абсолютное UTC-значение, потом пишется. При чтении — наоборот«.

    [UPD] Спустя три года(!) я знаю, где собака зарыта. В MySQL есть тип данных даты и времени. Он может быть представлен типом поля DATETIME, DATE и TIMESTAMP. В данном представлении «TIMESTAMP» — это действительно не то понятие, что в Unix. Это название буквенного формата типа «YYYYMMDDHHMMSS» или покороче. Не знаю историю, что было раньше, но кому-то (разрабам MySQL или Unix) не следовало называть разные понятия одним и тем же словом :) В качестве ликбеза читаем, например, здесь.

    Расставляя точки на i: MySQL полностью поддерживает UTC и нормально преобразует дату любого своего формата в Unix timestamp. Просто надо понимать разницу: тип поля может быть TIMESTAMP, и в нем будет записана форматированная дата/время. Если sql-запросом получить данные из этого поля, то будет скорее всего человекопонятная дата/время. А вот получить UTC из него можно например MySQL-функцией UNIX_TIMESTAMP() или php-функцией strtotime().

    Тип поля TIMESTAMP удобно использовать в логах, где можно автоматически назначать метку времени в записи. Для этого значением по умолчанию в поле указываем CURRENT_TIMESTAMP. Это MySQL-функция, которая пишет текущее время. Синтаксические аналоги: now() и sysdate(). Подробности опять же в RTFM.

    [UPD] MySQL конвертирует значения типа TIMESTAMP из текущего часового пояса в UTC при сохранении, и обратно из UTC в текущий часовой пояс при чтении. Но это не касается остальных типов, таких как DATETIME. (c) источник Однако тут требуется пояснение: при записи значения в поле DATETIME функцией NOW() или ее аналогами, время берется текущее на сервере с учетом заданного пояса. И записанное значение уже неизменно. Если же пишем в TIMESTAMP, вот тогда происходит перевод в UTC. И при чтении перевод в текущий часовой пояс. Т.е. значение типа TIMESTAMP зависит от заданного пояса сервера.

    На stackoverflow.com хорошо объяснено поведение MySQL со временем. Как рекомендация: установить часовой пояс MySQL-сервера в GMT (+0:00). Тогда при сохранении TIMESTAMP-значений на них не повлияет, например, летнее время какого-то пояса. При чтении так же не будет побочных эффектов. И если потребуется TIMESTAMP-значение привести в какой-то часовой пояс, это можно сделать уже на PHP.

    Если же вам нужно сохранить дату/время в неизменном виде независимо от времени года, cекунд координации и т.д., передавайте его явно и храните в полях типа DATETIME.

    Кстати, у типов DATETIME и TIMESTAMP отличаются диапазоны допустимых значений:

    • DATETIME: ‘1000-01-01 00:00:00’ — ‘9999-12-31 23:59:59’
    • TIMESTAMP: ‘1970-01-01 00:00:01’ UTC — ‘2038-01-19 03:14:07’ UTC.
    Функции

    now() — получить текущее время:

    mysql> select now();
    ->2010-05-18 09:54:30

    unix_timestamp() — получить текущее время в формате UTC

    mysql> select UNIX_TIMESTAMP(now());
    ->1274144095

    from_unixtime() — получить текущее читабельное дату/время из UTC

    mysql> select FROM_UNIXTIME(1274144095);
    ->2010-05-18 09:54:30

    Из PHP переключить зону MySQL-сессии можно так (действует до конца сессии):

    Если на MySQL-сервере не загружена таблица с временными зонами (болезнь моего хостера), то получишь ошибку типа: «ERROR 1298: Unknown or incorrect time zone: ‘Asia/Irkursk’«. Решить можно так — явно указать смещение в часах (переход на летнее время придется учитывать вручную, php-функция пересчета):

    Другой решение — так же ставим зону числом, но определяем ее, полагаясь на текущий часовой пояс php-скрипта (здесь автоматически учитывается переход на летнее время):

    Функцию putenv() вызываем, если в настройках сайта (не всего сервера) не установлена временная зона, или если ее нужно сменить для текущего скрипта.

    Gmdate — Форматирует дату/время по Гринвичу

    Postgres Pro поддерживает полный набор типов даты и времени SQL , показанный в Таблице 8.9. Операции, возможные с этими типами данных, описаны в Разделе 9.9. Все даты считаются по Григорианскому календарю, даже для времени до его введения (за дополнительными сведениями обратитесь к Разделу B.5).

    Таблица 8.9. Типы даты/времени

    Имя Размер Описание Наименьшее значение Наибольшее значение Точность
    timestamp [ ( p ) ] [ without time zone ] 8 байт дата и время (без часового пояса) 4713 до н. э. 294276 н. э. 1 микросекунда / 14 цифр
    timestamp [ ( p ) ] with time zone 8 байт дата и время (с часовым поясом) 4713 до н. э. 294276 н. э. 1 микросекунда / 14 цифр
    date 4 байта дата (без времени суток) 4713 до н. э. 5874897 н. э. 1 день
    time [ ( p ) ] [ without time zone ] 8 байт время суток (без даты) 00:00:00 24:00:00 1 микросекунда / 14 цифр
    time [ ( p ) ] with time zone 12 байт только время суток (с часовым поясом) 00:00:00+1459 24:00:00-1459 1 микросекунда / 14 цифр
    interval [ поля ] [ ( p ) ] 16 байт временной интервал -178000000 лет 178000000 лет 1 микросекунда / 14 цифр

    Примечание

    Стандарт SQL требует, чтобы тип timestamp подразумевал timestamp without time zone (время без часового пояса), и Postgres Pro следует этому. Для краткости timestamp with time zone можно записать как timestamptz ; это расширение Postgres Pro .

    Типы time , timestamp и interval принимают необязательное значение точности p , определяющее, сколько знаков после запятой должно сохраняться в секундах. По умолчанию точность не ограничивается. Для типов timestamp и interval p может принимать значения от 0 до 6.

    Примечание

    Когда значения timestamp хранятся в восьмибайтных целых (сейчас по умолчанию это так), на всём интервале значений обеспечивается точность в микросекундах. Если же значения этого типа сохраняются в числах двойной точности с плавающей точкой (устаревший вариант компиляции), фактический предел точности может быть меньше 6. Значения timestamp сохраняются в секундах до или после полуночи 1 января 2000 г. Когда при этом используются числа с плавающей точкой, микросекундная точность достигается для дат в пределах нескольких лет от этой даты, а при удалении от неё точность теряется. Однако заметьте, что даты в числах с плавающей точкой позволяют представить больший диапазон timestamp , чем было показано выше: от 4713 до н. э. до 5874897 н. э.

    В зависимости от того же варианта компиляции, типы time и interval могут сохраняться в виде чисел с плавающей точкой или в восьмибайтных целых. В случае с плавающей точкой при больших значениях interval точность уменьшается.

    Для типа time p может принимать значения от 0 до 6 при хранении типа в восьмибайтном целом и от 0 до 10 при хранении в числе с плавающей точкой.

    Тип interval дополнительно позволяет ограничить набор сохраняемых поле следующими фразами:

    Заметьте, что если указаны и поля , и точность p , указание поля должно включать SECOND , так как точность применима только к секундам.

    Тип time with time zone определён стандартом SQL, но в его определении описаны свойства сомнительной ценности. В большинстве случаев сочетание типов date , time , timestamp without time zone и timestamp with time zone удовлетворяет все потребности в функционале дат/времени, возникающие в приложениях.

    Типы abstime и reltime имеют меньшую точность и предназначены для внутреннего использования. Эти типы не рекомендуется использовать в обычных приложениях; их может не быть в будущих версиях.

    8.5.1. Ввод даты/времени

    Значения даты и времени принимаются практически в любом разумном формате, включая ISO 8601, SQL -совместимый, традиционный формат POSTGRES и другие. В некоторых форматах порядок даты, месяца и года во вводимой дате неоднозначен и поэтому поддерживается явное определение формата. Для этого предназначен параметр DateStyle. Когда он имеет значение MDY , выбирается интерпретация месяц-день-год, значению DMY соответствует день-месяц-год, а YMD — год-месяц-день.

    Помните, что любые вводимые значения даты и времени нужно заключать в апострофы, как текстовые строки. За дополнительной информацией обратитесь к Подразделу 4.1.2.7. SQL предусматривает следующий синтаксис:

    Здесь p — необязательное указание точности, определяющее число знаков после точки в секундах. Точность может быть определена для типов time , timestamp и interval в пределах, описанных выше. Если в определении константы точность не указана, она считается равной точности значения в строке.

    8.5.1.1. Даты

    В Таблице 8.10 приведены некоторые допустимые значения типа date .

    Таблица 8.10. Вводимые даты

    Пример Описание
    1999-01-08 ISO 8601; 8 января в любом режиме (рекомендуемый формат)
    January 8, 1999 воспринимается однозначно в любом режиме datestyle
    1/8/1999 8 января в режиме MDY и 1 августа в режиме DMY
    1/18/1999 18 января в режиме MDY ; недопустимая дата в других режимах
    01/02/03 2 января 2003 г. в режиме MDY ; 1 февраля 2003 г. в режиме DMY и 3 февраля 2001 г. в режиме YMD
    1999-Jan-08 8 января в любом режиме
    Jan-08-1999 8 января в любом режиме
    08-Jan-1999 8 января в любом режиме
    99-Jan-08 8 января в режиме YMD ; ошибка в других режимах
    08-Jan-99 8 января; ошибка в режиме YMD
    Jan-08-99 8 января; ошибка в режиме YMD
    19990108 ISO 8601; 8 января 1999 в любом режиме
    990108 ISO 8601; 8 января 1999 в любом режиме
    1999.008 год и день года
    J2451187 дата по юлианскому календарю
    January 8, 99 BC 99 до н. э.

    8.5.1.2. Время

    Для хранения времени суток без даты предназначены типы time [ ( p ) ] without time zone и time [ ( p ) ] with time zone . Тип time без уточнения эквивалентен типу time without time zone .

    Допустимые вводимые значения этих типов состоят из записи времени суток и необязательного указания часового пояса. (См. Таблицу 8.11 и Таблицу 8.12.) Если в значении для типа time without time zone указывается часовой пояс, он просто игнорируется. Так же будет игнорироваться дата, если её указать, за исключением случаев, когда в указанном часовом поясе принят переход на летнее время, например America/New_York . В данном случае указать дату необходимо, чтобы система могла определить, применяется ли обычное или летнее время. Соответствующее смещение часового пояса записывается в значении time with time zone .

    Таблица 8.11. Вводимое время

    Пример Описание
    04:05:06.789 ISO 8601
    04:05:06 ISO 8601
    04:05 ISO 8601
    040506 ISO 8601
    04:05 AM то же, что и 04:05; AM не меняет значение времени
    04:05 PM то же, что и 16:05; часы должны быть 04:05:06.789-8 ISO 8601
    04:05:06-08:00 ISO 8601
    04:05-08:00 ISO 8601
    040506-08 ISO 8601
    04:05:06 PST часовой пояс задаётся аббревиатурой
    2003-04-12 04:05:06 America/New_York часовой пояс задаётся полным названием

    Таблица 8.12. Вводимый часовой пояс

    Пример Описание
    PST аббревиатура (Pacific Standard Time, Стандартное тихоокеанское время)
    America/New_York полное название часового пояса
    PST8PDT указание часового пояса в стиле POSIX
    -8:00 смещение часового пояса PST по ISO-8601
    -800 смещение часового пояса PST по ISO-8601
    -8 смещение часового пояса PST по ISO-8601
    zulu принятое у военных сокращение UTC
    z краткая форма zulu

    Подробнее узнать о том, как указывается часовой пояс, можно в Подразделе 8.5.3.


    8.5.1.3. Даты и время

    Допустимые значения типов timestamp состоят из записи даты и времени, после которого может указываться часовой пояс и необязательное уточнение AD или BC , определяющее эпоху до нашей эры и нашу эру соответственно. ( AD / BC можно указать и перед часовым поясом, но предпочтительнее первый вариант.) Таким образом:

    должен соответствовать тип timestamp without time zone , а

    тип timestamp with time zone . Postgres Pro никогда не анализирует содержимое текстовой строки, чтобы определить тип значения, и поэтому обе записи будут обработаны как значения типа timestamp without time zone . Чтобы текстовая константа обрабатывалась как timestamp with time zone , укажите этот тип явно:

    В константе типа timestamp without time zone Postgres Pro просто игнорирует часовой пояс. То есть результирующее значение вычисляется только из полей даты/времени и не подстраивается под указанный часовой пояс.

    Значения timestamp with time zone внутри всегда хранятся в UTC (Universal Coordinated Time, Всемирное скоординированное время или время по Гринвичу, GMT ). Вводимое значение, в котором явно указан часовой пояс, переводится в UTC с учётом смещения данного часового пояса. Если во входной строке не указан часовой пояс, подразумевается часовой пояс, заданный системным параметром TimeZone и время так же пересчитывается в UTC со смещением timezone .

    Когда значение timestamp with time zone выводится, оно всегда преобразуется из UTC в текущий часовой пояс timezone и отображается как локальное время. Чтобы получить время для другого часового пояса, нужно либо изменить timezone , либо воспользоваться конструкцией AT TIME ZONE (см. Подраздел 9.9.3).

    В преобразованиях между timestamp without time zone и timestamp with time zone обычно предполагается, что значение timestamp without time zone содержит местное время (для часового пояса timezone ). Другой часовой пояс для преобразования можно задать с помощью AT TIME ZONE .

    8.5.1.4. Специальные значения

    Postgres Pro для удобства поддерживает несколько специальных значений даты/времени, перечисленных в Таблице 8.13. Значения infinity и -infinity имеют особое представление в системе и они отображаются в том же виде, тогда как другие варианты при чтении преобразуются в значения даты/времени. (В частности, now и подобные строки преобразуются в актуальные значения времени в момент чтения.) Чтобы использовать эти значения в качестве констант в командах SQL, их нужно заключать в апострофы.

    Таблица 8.13. Специальные значения даты/времени

    Вводимая строка Допустимые типы Описание
    epoch date , timestamp 1970-01-01 00:00:00+00 (точка отсчёта времени в Unix)
    infinity date , timestamp время после максимальной допустимой даты
    -infinity date , timestamp время до минимальной допустимой даты
    now date , time , timestamp время начала текущей транзакции
    today date , timestamp время начала текущих суток
    tomorrow date , timestamp время начала следующих суток
    yesterday date , timestamp время начала предыдущих суток
    allballs time 00:00:00.00 UTC

    8.5.2. Вывод даты/времени

    В качестве выходного формата типов даты/времени можно использовать один из четырёх стилей: ISO 8601, SQL (Ingres), традиционный формат POSTGRES (формат date в Unix) или German. По умолчанию выбран формат ISO . (Стандарт SQL требует, чтобы использовался именно ISO 8601. Другой формат называется « SQL » исключительно по историческим причинам.) Примеры всех стилей вывода перечислены в Таблице 8.14. Вообще со значениями типов date и time выводилась бы только часть даты или времени из показанных примеров, но со стилем POSTGRES значение даты без времени выводится в формате ISO .

    Таблица 8.14. Стили вывода даты/время

    Стиль Описание Пример
    ISO ISO 8601, стандарт SQL 1997-12-17 07:37:16-08
    SQL традиционный стиль 12/17/1997 07:37:16.00 PST
    Postgres изначальный стиль Wed Dec 17 07:37:16 1997 PST
    German региональный стиль 17.12.1997 07:37:16.00 PST

    Примечание

    ISO 8601 указывает, что дата должна отделяться от времени буквой T в верхнем регистре. Postgres Pro принимает этот формат при вводе, но при выводе вставляет вместо T пробел, как показано выше. Это сделано для улучшения читаемости и для совместимости с RFC 3339 и другими СУБД.

    Таблица 8.15. Соглашения о порядке компонентов даты

    Параметр datestyle Порядок при вводе Пример вывода
    SQL, DMY день / месяц / год 17/12/1997 15:37:16.00 CET
    SQL, MDY месяц / день / год 12/17/1997 07:37:16.00 PST
    Postgres, DMY день / месяц / год Wed 17 Dec 07:37:16 1997 PST

    Стиль даты/времени пользователь может выбрать с помощью команды SET datestyle , параметра DateStyle в файле конфигурации postgresql.conf или переменной окружения PGDATESTYLE на сервере или клиенте.

    Для большей гибкости при форматировании выводимой даты/времени можно использовать функцию to_char (см. Раздел 9.8).

    8.5.3. Часовые пояса

    Часовые пояса и правила их применения определяются, как вы знаете, не только по географическим, но и по политическим соображениям. Часовые пояса во всём мире были более-менее стандартизированы в начале прошлого века, но они продолжают претерпевать изменения, в частности это касается перехода на летнее время. Для расчёта времени в прошлом Postgres Pro получает исторические сведения о правилах часовых поясов из распространённой базы данных IANA (Olson). Для будущего времени предполагается, что в заданном часовом поясе будут продолжать действовать последние принятые правила.

    Хотя для типа date часовой пояс указать нельзя, это можно сделать для типа time . В реальности это не очень полезно, так как без даты нельзя точно определить смещение при переходе на летнее время.

    Поэтому мы советуем использовать часовой пояс с типами, включающими и время, и дату. Мы не рекомендуем использовать тип time with time zone (хотя Postgres Pro поддерживает его для старых приложений и совместимости со стандартом SQL ). Для типов, включающих только дату или только время, в Postgres Pro предполагается местный часовой пояс.

    Postgres Pro позволяет задать часовой пояс тремя способами:

    Полное название часового пояса, например America/New_York . Все допустимые названия перечислены в представлении pg_timezone_names (см. Раздел 49.78). Определения часовых поясов Postgres Pro берёт из широко распространённой базы IANA, так что имена часовых поясов Postgres Pro будут воспринимать и другие приложения.

    Аббревиатура часового пояса, например PST . Такое определение просто задаёт смещение от UTC, в отличие от полных названий поясов, которые кроме того подразумевают и правила перехода на летнее время. Распознаваемые аббревиатуры перечислены в представлении pg_timezone_abbrevs (см. Раздел 49.77). Аббревиатуры можно использовать во вводимых значениях даты/времени и в операторе AT TIME ZONE , но не в параметрах конфигурации TimeZone и log_timezone.

    В дополнение к полным названиям и аббревиатурам часовых поясов Postgres Pro принимает указания часового пояса в стиле POSIX: STD смещение или STD смещение DST , где STD — аббревиатура пояса, смещение — разница с UTC, а DST — необязательное дополнение, обозначающее летнее время и добавляющее к смещению ещё один час. Например, если бы обозначение EST5EDT не являлось названием часового пояса, оно всё равно было бы воспринято и функционально соответствовало бы поясу североамериканского восточного времени. При такой записи аббревиатура пояса может быть набором букв или обычной строкой, заключённой в угловые скобки (( <> ). Когда представлено название пояса с летним временем, при пересчёте времени будут использоваться правила перехода на летнее время, описанные в базе данных IANA в файле posixrules . В стандартной инсталляции Postgres Pro файл posixrules соответствует описанию US/Eastern , так что для указаний часовых поясов в стиле POSIX применяются правила перехода на летнее время, принятые в США. При необходимости это можно изменить, заменив файл posixrules .

    Вкратце, различие между аббревиатурами и полными названиями заключаются в следующем: аббревиатуры представляют определённый сдвиг от UTC, а полное название подразумевает ещё и местное правило по переходу на летнее время, то есть, возможно, два сдвига от UTC. Например, 2014-06-04 12:00 America/New_York представляет полдень по местному времени в Нью-Йорк, что для данного дня было бы летним восточным временем (EDT или UTC-4). Так что 2014-06-04 12:00 EDT обозначает тот же момент времени. Но 2014-06-04 12:00 EST задаёт стандартное восточное время (UTC-5), не зависящее о того, действовало ли летнее время в этот день.

    Мало того, в некоторых юрисдикциях одна и та же аббревиатура часового пояса означала разные сдвиги UTC в разное время; например, аббревиатура московского времени MSK несколько лет означала UTC+3, а затем стала означать UTC+4. Postgres Pro обрабатывает такие аббревиатуры в соответствии с их значениями на заданную дату, но, как и с примером выше EST , это не обязательно будет соответствовать местному гражданскому времени в этот день.

    При этом следует использовать возможность указания часового пояса в стиле POSIX с осторожностью, так как при этом могут быть приняты заведомо неверные данные, потому что разумность аббревиатуры никак не проверяется. Например, команда SET TIMEZONE TO FOOBAR0 будет работать и система примет эту довольно оригинальную аббревиатуру для UTC. Также следует учитывать, что в названиях часовых поясов POSIX положительные смещения соответствуют сдвигу к западу Гринвича. Во всех остальных формах Postgres Pro следует соглашению ISO-8601, по которому положительным смещениям соответствует сдвиг к востоку от Гринвича.

    Независимо от формы, регистр в названиях и аббревиатурах часовых поясов не важен. (В PostgreSQL до версии 8.2 он где-то имел значение, а где-то нет.)

    Ни названия, ни аббревиатуры часовых поясов, не зашиты в самом сервере; они считываются из файлов конфигурации, находящихся в путях . /share/timezone/ и . /share/timezonesets/ относительно каталога установки (см. Раздел B.4).

    Параметр конфигурации TimeZone можно установить в postgresql.conf или любым другим стандартным способом, описанным в Главе 18. Часовой пояс может быть также определён следующими специальными способами:

    Если установлена переменная окружения PGTZ , клиенты libpq используют её значение, выполняя при подключении к серверу команду SET TIME ZONE .

    8.5.4. Ввод интервалов

    Значения типа interval могут быть записаны в следующей расширенной форме:

    где количество — это число (возможно, со знаком); единица — одно из значений: microsecond , millisecond , second , minute , hour , day , week , month , year , decade , century , millennium (которые обозначают соответственно микросекунды, миллисекунды, секунды, минуты, часы, дни, недели, месяцы, годы, десятилетия, века и тысячелетия), либо эти же слова во множественном числе, либо их сокращения; направление может принимать значение ago (назад) или быть пустым. Знак @ является необязательным. Все заданные величины различных единиц суммируются вместе с учётом знака чисел. Указание ago меняет знак всех полей на противоположный. Этот синтаксис также используется при выводе интервала, если параметр IntervalStyle имеет значение postgres_verbose .

    Количества дней, часов, минут и секунд можно определить, не указывая явно соответствующие единицы. Например, запись ‘1 12:59:10’ равнозначна ‘1 day 12 hours 59 min 10 sec’ . Сочетание года и месяца также можно записать через минус; например ‘200-10’ означает то, же что и ‘200 years 10 months’ . (На самом деле только эти краткие формы разрешены стандартом SQL и они используются при выводе, когда IntervalStyle имеет значение sql_standard .)

    Интервалы можно также записывать в виде, определённом в ISO 8601, либо в « формате с кодами » , описанном в разделе 4.4.3.2 этого стандарта, либо в « альтернативном формате » , описанном в разделе 4.4.3.3. Формат с кодами выглядит так:

    Строка должна начинаться с символа P и может включать также T перед временем суток. Допустимые коды единиц перечислены в Таблице 8.16. Коды единиц можно опустить или указать в любом порядке, но компоненты времени суток должны идти после символа T . В частности, значение кода M зависит от того, располагается ли он до или после T .

    Таблица 8.16. Коды единиц временных интервалов ISO 8601

    Код Значение
    Y годы
    M месяцы (в дате)
    W недели
    D дни
    H часы
    M минуты (во времени)
    S секунды

    В альтернативном формате:

    строка должна начинаться с P , а T разделяет компоненты даты и времени. Значения выражаются числами так же, как и в датах ISO 8601.


    При записи интервальной константы с указанием полей или присвоении столбцу типа interval строки с полями , интерпретация непомеченных величин зависит от полей . Например, INTERVAL ‘1’ YEAR воспринимается как 1 год, а INTERVAL ‘1’ — как 1 секунда. Кроме того, значения « справа » от меньшего значащего поля, заданного в определении полей , просто отбрасываются. Например, в записи INTERVAL ‘1 day 2:03:04’ HOUR TO MINUTE будут отброшены секунды, но не день.

    В расширенном формате ввода и в некоторых полях более компактных форматов значения компонентов могут иметь дробные части, например ‘1.5 week’ или ’01:02:03.45′ . Такое значение при сохранении пересчитывается в соответствующее число месяцев, дней и секунд. Когда при этом остаётся дробная часть в месяцах или в днях, она переносится в младший компонент с допущением, что 1 месяц = 30 дней, а 1 день = 24 часа. Например, значение ‘1.5 month’ будет преобразовано в 1 месяц и 15 дней. В виде дробного числа хранятся и выводятся только секунды.

    В Таблице 8.17 показано несколько примеров допустимых вводимых значений типа interval .

    Таблица 8.17. Ввод интервалов

    Пример Описание
    1-2 Стандартный формат SQL: 1 год и 2 месяца
    3 4:05:06 Стандартный формат SQL: 3 дня 4 часа 5 минут 6 секунд
    1 year 2 months 3 days 4 hours 5 minutes 6 seconds Традиционный формат Postgres: 1 год 2 месяца 3 дня 4 часа 5 минут 6 секунд
    P1Y2M3DT4H5M6S « Формат с кодами » ISO 8601: то же значение, что и выше
    P0001-02-03T04:05:06 « Альтернативный формат » ISO 8601: то же значение, что и выше

    Тип interval представлен внутри в виде отдельных значений месяцев, дней и секунд. Это объясняется тем, что число дней в месяце может быть разным, а в сутках может быть и 23, и 25 часов в дни перехода на летнее/зимнее время. Значения месяцев и дней представлены целыми числами, а число секунд может быть дробным. Так как интервалы обычно получаются из строковых констант или при вычитании типов timestamp , этот способ хранения эффективен в большинстве случаев, но может давать неожиданные результаты:

    Для корректировки числа дней и часов, когда они выходят за обычные границы, есть специальные функции justify_days и justify_hours .

    8.5.5. Вывод интервалов

    Формат вывода типа interval может определяться одним из четырёх стилей: sql_standard , postgres , postgres_verbose и iso_8601 . Выбрать нужный стиль позволяет команда SET intervalstyle (по умолчанию выбран postgres ). Примеры форматов разных стилей показаны в Таблице 8.18.

    Стиль sql_standard выдаёт результат, соответствующий стандарту SQL, если значение интервала удовлетворяет ограничениям стандарта (и содержит либо только год и месяц, либо только день и время, и при этом все его компоненты одного знака). В противном случае выводится год-месяц, за которым идёт дата-время, а в компоненты для однозначности явно добавляются знаки.

    Вывод в стиле postgres соответствует формату, который был принят в PostgreSQL до версии 8.4, когда параметр DateStyle имел значение ISO .

    Вывод в стиле postgres_verbose соответствует формату, который был принят в PostgreSQL до версии 8.4, когда значением параметром DateStyle было не ISO .

    Вывод в стиле iso_8601 соответствует « формату с кодами » описанному в разделе 4.4.3.2 формата ISO 8601.

    Таблица 8.18. Примеры стилей вывода интервалов

    Типы данных даты и времени в PL/SQL

    Большинство приложений выполняют те или иные операции со значениями даты и времени. Работать с датами довольно сложно; кроме того что приходится иметь дело с жестким форматированием данных, существует множество правил определения их допустимых значений и проведения корректных вычислений (приходится учитывать високосные годы, национальные праздники и выходные, диапазоны дат и т. д.). К счастью, СУБД Oracle и PL/SQL предоставляют набор типов данных для хранения даты и времени в стандартном внутреннем формате.

    Для любого значения даты или времени Oracle сохраняет некоторые (или все) из перечисленных составляющих: год, месяц, день, час, минуты, секунды, часовой пояс, смещение часового пояса в часах, смещение часового пояса в минутах.

    Впрочем, поддержка типов даты и времени — только часть дела. Еще необходим язык, средства которого позволяют удобно и естественно работать с этими значениями. Oracle обеспечивает разработчиков исчерпывающим набором функций для выполнения все-возможных операций с датами и временем.

    В течение долгого времени для работы с датой и временем в Oracle поддерживался только тип DATE . В Oracle9i ситуация немного изменилась: появились три новых типа TIMESTAMP и два новых типа INTERVAL . Они предоставляют много новых полезных возможностей, одновременно улучшая совместимость Oracle со стандартом ISO SQL. Типы данных INTERVAL подробно рассматриваются позднее в моем блоге, а пока остановимся на четырех основных типах даты/времени.

    • DATE
      Хранит значение даты и времени с точностью до секунд. Не содержит информации часового пояса.
    • TIMESTAMP
      Хранит значение даты и времени без информации о часовом поясе. Эквивалентен типу данных DATE, отличаясь от него лишь тем, что время хранится с точностью до миллиардной доли секунды.
    • TIMESTAMP WITH TIME ZONE
      Хранит вместе со значением даты и времени информацию о часовом поясе с точностью до девяти десятичных позиций.
    • TIMESTAMP WITH LOCAL TIME ZONE
      Хранит значение даты и времени с точностью до девяти десятичных позиций. Значения этого типа автоматически преобразуются между часовым поясом базы данных и местным (сеансовым) часовым поясом. При хранении в базе данных значения преобразуются к часовому поясу базы данных, а при выборке они преобразуются к местному (сеансовому) часовому поясу.

    Разобраться во всех особенностях этих типов, особенно TIMESTAMP WITH LOCAL TIME ZONE , бывает непросто. Для примера рассмотрим использование типа TIMESTAMP WITH LOCAL TIME ZONE в календарном приложении для пользователей, работающих в разных часовых поясах. В качестве времени базы данных используется всеобщее скоординированное время UTC (Universal Coordinated Time — см. далее врезку «Всеобщее скоординированное время»). Пользователь Джонатан, живущий в Мичигане (Восточный часовой пояс, смещение от UTC составляет –4:00), запланировал проведение видеоконференции с 16:00 до 17:00 в четверг по своему местному времени. У Донны из Денвера (Горный часовой пояс, смещение составляет –6:00) конференция приходится на промежуток времени с 14:00 до 15:00 в четверг. У Селвы из Индии (смещение +5:30) конференция пройдет с 01:30 до 02:30 в пятницу. На рис. 1 показано, как время начала конференции изменяется при выборке из базы данных пользователями из разных часовых поясов.

    Рис. 1. Разные типы значений даты-времени

    На рис. 1 пользователь Джонатан находится в Восточном часовом поясе с действием летнего времени, в котором время отстает от UTC на 4 часа (UTC-4:00). Джонатан вводит время начала собрания 16:00. Это значение преобразуется к часовому поясу базы данных (UTC) при вставке записи, и в базе данных сохраняется значение 20:00.

    Донна находится в Денвере, где также действует летнее время; текущее время отстает от UTC (UTC-6:00). Когда Донна выбирает время начала встречи, значение преобразуется к сеансовому часовому поясу и отображается в формате 14:00. Селва находится в Индии, где летнее время не действует — индийское стандартное время смещено на 5,5 часа вперед от UTC (UTC+5:30). Когда Селва выбирает время начала встречи, значение преобразуется к сеансовому часовому поясу и выводится в формате 1:30.

    Поручая преобразования часовых поясов типу данных TIMESTAMP WITH LOCAL TIME ZONE , вы избавляетесь от необходимости программирования сложных правил, связанных с часовыми поясами и летним временем (которое иногда изменяется, как это было в США в 2007 году), а заодно избавляете ваших пользователей от необходимости разбираться с преобразованиями. Правильное время будет предоставляться каждому пользователю просто и элегантно.

    В одних случаях база данных должна автоматически изменять формат вывода времени, в других это не нужно. Если вы не хотите, чтобы формат значения времени изменялся в соответствии с сеансовыми настройками, используйте тип данных TIMESTAMP или TIMESTAMP WITH TIME ZONE .

    Всеобщее скоординированное время

    Всеобщее скоординированное время, обозначаемое сокращением UTC (Coordinated Universal Time), измеряется с применением высокоточных атомных часов и закладывает основу для мировой системы гражданского времени. Например, все часовые пояса определяются их смещением от UTC. Время UTC измеряется по атомному эталону и периодически регулируется через механизм корректировочных секунд для поддержания синхронизации с временем, определяемым по вращению Земли.

    Возможно, вы также знакомы с временем по Гринвичскому меридиану, или GMT (Greenwich Mean Time). Как правило, в практическом контексте это обозначение эквивалентно UTC.

    Почему выбрано сокращение UTC, а не CUT? Комитет по стандартизации не мог решить, стоит ли использовать английское сокращение CUT или французское TUC, поэтому сошлись на сокращении UTC, которое не соответствует ни одному языку.

    За дополнительной информацией о UTC обращайтесь к документации Национального института стандартов и технологий (http://www.nist.gov/pml/general/time/world.cfm) и списку FAQ (http://www.nist.gov/pml/div688/faq.cfm).

    Объявление переменных даты и времени в PL/SQL

    Синтаксис объявления переменной, представляющей дату и время, выглядит так:

    Поле тип заменяется одним из следующих типов:

    Значение параметра точность определяет количество десятичных цифр, выделяемое для хранения долей секунды. По умолчанию оно равно 6, то есть время может отслеживаться с точностью до 0,000001 секунды. Допускаются значения от 0 до 9, позволяющие сохранять время суток с высокой точностью.

    Функции, возвращающие значения типа TIMESTAMP (например, SYSTIMESTAMP ), всегда возвращают данные с шестью цифрами точности.

    Несколько примеров объявлений:

    Исходное_значение задается либо при помощи функции преобразования (например, TO_TIMESTAMP ), либо с использованием литерала даты/времени. Оба варианта описаны далее в разделе «Преобразования даты и времени».

    Поведение переменной типа TIMESTAMP(0) идентично поведению переменной типа DATE .

    Выбор типа данных

    Естественно, при таком богатстве выбора хочется понять, из каких соображений следует выбирать тип данных для представления даты/времени в той или иной ситуации. В значительной степени выбор типа данных зависит от требуемой детализации:

    • Чтобы хранить время с точностью до долей секунды, используйте один из типов TIMESTAMP .
    • Чтобы время автоматически преобразовывалось между часовыми поясами базы данных и сеанса, используйте тип TIMESTAMP WITH LOCAL TIME ZONE.
    • Чтобы отслеживать часовой пояс сеанса, в котором были введены данные, используйте тип TIMESTAMP WITH TIME ZONE.
    • Вы можете использовать TIMESTAMP вместо DATE. TIMESTAMP без долей секунд занимает 7 байт, как и тип данных DATE . При хранении долей секунд он занимает 11 байт.

    Также могут действовать и другие факторы:

    • Используйте DATE в тех ситуациях, в которых необходимо сохранить совместимость с существующим приложением, написанным до появления типов данных TIMESTAMP .
    • В общем случае рекомендуется использовать в коде PL/SQL типы данных, соответствующие типам используемых таблиц базы данных (или по крайней мере совместимые с ними). Например, дважды подумайте, прежде чем читать значение TIMESTAMP из таблицы в переменную DATE , потому что это может привести к потере информации (в данном случае — долей секунд, и возможно, часового пояса).
    • Если вы работаете с версией старше Oracle9i Database, у вас нет выбора — придется использовать DATE .
    • При сложении и вычитании годов и месяцев поведение функции ADD_MONTHS , работающей со значениями типа DATE , отличается от поведения интервальных арифметических операций с типами TIMESTAMP . За дополнительной информацией по этому важному, но неочевидному вопросу обращайтесь к разделу «Когда используются типы INTERVAL ».

    Будьте осторожны при совместном использовании типов данных DATE и TIMESTAMP . Правила арифметических операций для этих типов сильно различаются. Будьте внимательны при использовании традиционных встроенных функций даты Oracle (таких, как ADD_MONTHS или MONTHS_BETWEEN ) к значениям типов TIMESTAMP . См. далее раздел «Арифметические операции над значениями даты/времени».

    ТЛ; др

    Ответа на этот вопрос Damilola правильно, предполагая использовать рамки java.time встроенный в Java 8 и более поздних версий. Но этот Ответ использует ZonedDateTime класс, который является избыточным, если вы просто хотите использовать UTC, а не какой-либо конкретный часовой пояс.

    Проблемные старые классы даты и времени теперь унаследованы, заменены классами java.time.


    Instant

    Instant Класс представляет собой момент на временной шкале в формате UTC с разрешением наносекунд (до девяти (9) цифр десятичной дроби).

    instant.toString (): 2020-11-29T23: 18: 14.604Z

    Вы можете думать Instant как строительный блок, к которому вы можете добавить часовой пояс ( ZoneID ), чтобы получить ZonedDateTime .

    О java.time

    Java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытеснять неприятные старые устаревшие классы даты и времени , такие как java.util.Date , Calendar , и SimpleDateFormat .

    Проект Joda-Time , находящийся сейчас в режиме обслуживания , рекомендует перейти на java.time.

    Чтобы узнать больше, смотрите Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .

    Где взять классы java.time?

    • Java SE 8 иSE 9 и позже
      • Встроенный.
      • Часть стандартного Java API с комплексной реализацией.
      • Java 9 добавляет некоторые незначительные функции и исправления.
    • Java SE 6 иSE 7
      • Большая часть функциональности java.time перенесена на Java 6 и 7 в ThreeTen-Backport .
    • Android
      • Проект ThreeTenABP адаптирует ThreeTen-Backport (упомянутый выше) специально для Android.
      • См Как использовать . .

    Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Вы можете найти некоторые полезные классы здесь , такие как Interval , YearWeek , YearQuarter , и более .

    плюса

    1386 Репутация автора

    Ниже приведены полезные методы Utils для управления временем в GMT с помощью DST Savings:

    Автор: Kalpesh Размещён: 29.11.2020 01:20

    плюса

    431 Репутация автора

    После Java 8 вы можете получить отформатированное время, как показано ниже:

    плюса

    34698 Репутация автора

    Ты не можешь

    Во-первых, вы спрашиваете о невозможном. Старомодный Date объект не получил, так как не может иметь часовой пояс или смещение по Гринвичу.

    Но дата всегда интерпретируется в моем местном часовом поясе.

    Я предполагаю, что вы напечатали Date или сделали что-то еще, что неявно вызывает его toString метод. Я считаю, что это единственный раз, когда Date интерпретируется в вашем часовом поясе. Точнее в текущем часовом поясе по умолчанию вашей JVM. С другой стороны, это неизбежно. Date.toString() ведет себя таким образом, он выбирает настройку часового пояса JVM и использует ее для рендеринга возвращаемой строки.

    Вы можете с java.time

    Вы не должны использовать Date , хотя. Этот класс плохо спроектирован и, к счастью, давно устарел. Также java.time, современный Java-API даты и времени, который заменяет его, имеет один или два класса для даты и времени со смещением от GMT или UTC. Я считаю GMT и UTC синонимами, строго говоря, это не так.

    Когда я только что запустил этот фрагмент, результат был:

    Время в UTC (GMT): 2020-06-17T11: 51: 38.246188Z

    FPublisher

    Web-технологии: База знаний

    Документация PHP

    Date and Time Функции

    Содержание

    • checkdate — Проверяет правильность даты по грегорианскому календарю
    • date_create — Returns new DateTime object
    • date_date_set — Sets the date
    • date_default_timezone_get — Gets the default timezone used by all date/time functions in a script
    • date_default_timezone_set — Sets the default timezone used by all date/time functions in a script
    • date_format — Returns date formatted according to given format
    • date_isodate_set — Sets the ISO date
    • date_modify — Alters the timestamp
    • date_offset_get — Returns the daylight saving time offset
    • date_parse — Returns associative array with detailed info about given date
    • date_sun_info — Returns an array with information about sunset/sunrise and twilight begin/end
    • date_sunrise — Returns time of sunrise for a given day and location
    • date_sunset — Returns time of sunset for a given day and location
    • date_time_set — Sets the time
    • date_timezone_get — Return time zone relative to given DateTime
    • date_timezone_set — Sets the time zone for the DateTime object
    • date — Форматирует системную дату/время
    • getdate — Возвращает информацию о дате/времени
    • gettimeofday — Возвращает текущее время
    • gmdate — Форматирует дату/время по Гринвичу
    • gmmktime — Возвращает метку времени Unix для времени по Гринвичу
    • gmstrftime — Форматирует дату/время по Гринвичу с учетом текущей локали
    • idate — Format a local time/date as integer
    • localtime — Возвращает системное время
    • microtime — Возвращает метку времени с микросекундами
    • mktime — Возвращает метку времени для заданной даты
    • strftime — Форматирует текущую дату/время с учетом текущей локали
    • strptime — Parse a time/date generated with strftime
    • strtotime — Преобразует текстовое представление даты на английском языке в метку времени Unix
    • time — Возвращает текущую метку времени
    • timezone_abbreviations_list — Returns associative array containing dst, offset and the timezone name
    • timezone_identifiers_list — Returns numerically index array with all timezone identifiers
    • timezone_name_from_abbr — Returns the timezone name from abbrevation
    • timezone_name_get — Returns the name of the timezone
    • timezone_offset_get — Returns the timezone offset from GMT
    • timezone_open — Returns new DateTimeZone object
    • timezone_transitions_get — Returns all transitions for the timezone

    Последние поступления:

    ТехЗадание на Землю

    Размещена 14 марта 2020 года

    Пpоект Genesis (из коpпоpативной пеpеписки)

    Шпаргалка по работе с Vim

    Размещена 05 декабря 2020 года

    Vim довольно мощный редактор, но работа с ним не всегда наглядна.
    Например если нужно отредактировать какой-то файл например при помощи crontab, без знания специфики работы с viv никак.

    Ошибка: Error: Cannot find a val >Размещена 13 сентабря 2020 года

    Если возникает ошибка на centos 5 вида
    YumRepo Error: All mirror URLs are not using ftp, http[s] or file.
    Eg. Invalid release/

    Linux Optimization

    Размещена 30 июля 2012 года

    Илон Маск рекомендует:  Firefox Marketplace
    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL