Формат utc в 1с
Обновлено: 07.07.2024
Итак, столкнулся с довольно тривиальной задачей — посчитать промежуток времени в секундах, минутах, часах, и днях между двумя датами и временем. Задача, в общем-то, не новая и легко решается на ПК.
Суть этого поста — адаптировать подобные преобразования для МК.
Сразу оговорюсь, что мы не будем учитывать зональность времени, а будем вычислять по гринвичу.
Конвертация из YYYY:MM:DD:HH:MM:SS в uint32_t
Итак существует несколько проблем:
— високосный год
— високосное столетие
— високосное четырехсотлетие
— разные длины месяцев.
— февраль находится в неудобном для вычисления положения: где-то между началом и концом года.
Итак, попробуем сделать так, чтобы облегчить вычисления.
Первое что нужно сделать — поместить февраль в хвост вычислений. Сделаем как-бы альтернативный год, в котором «новый год» будет 1 марта. Таким образом если мы будем сразу правильно вычислять начало заданного года, т.е. 1 марта, то с февралем у нас проблем не возникнет, так как он не будет влиять на смещение порядкового номера дат в этом году, просто 28 февраля будет 364-м порядковым числом (потому что считаем от нуля), а 29 февраля — 365-м. Приняли.
Второе: Так как у нас год стал стабильным на всем его протяжении, кроме самого конца, нам потребуется всего одна таблица дней смещений.
вот она:
где элементы массива указывают на смещение в кол-ве дней на каждый месяц, начиная с марта. Впрочем, можно вычислять и иным способом, по формуле:
где month — номер месяца, причем март = 0; апрель = 1 и т. д.
В общем-то и все. Напишем функцию:
Началом отсчета будет 1 марта 2000 года 00:00:00. Для совместимости с Unix time можно прибавить константу 951868800
Эта дата удобна не только с позиции «круглого» года, но и тем, что мы находимся в самом начале 400-летнего цикла григорианского календаря. А еще — сравнительно небольшие текущие числа, которые еще лет 50 не будут создавать проблем в числе с размерностью int, и тем более в uint32_t.
Итак, с помощью этой функции мы делаем порядковое число секунды, начиная с момента 1 марта 2000 00:00:00
Теперь узнать промежуток в секундах между двумя датами не составит труда.
Ну а если требуется отобразить интервал в днях, часах, минутах и секундах, то напишем следующую функцию:
Функция Формат в 1С 8.3 предоставляет достаточно интересный инструмент разработчику для форматирования значений. Особенно часто эта функция используется для вывода примитивных типов данных (даты, времени, чисел, строки, булево) в нужном формате.
Рассмотрим подробнее функцию и способ составления форматной строки.
Функция Формат()
Синтаксис функции достаточно прост:
Конструктор форматной строки
Для облегчения труда разработчика фирма 1С встроила в платформу специальный конструктор форматной строки.
Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания - попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>
Сам конструктор выглядит следующим образом:
Рассмотрим использование функции на примерах.
Формат даты в 1С на примере месяца: прописью, без времени
Получить формат даты без времени:
Формат даты 1С, где месяц прописью:
Формат времени без даты, только час, минута и секунда:
Примеры формата числа
Получим формат числа с двумя точками после запятой:
Число без неразрывных пробелов:
Использование запятой вместо точки для дробной части:
Округление числа (не математическое) до целых:
Вывод лидирующих нулей без неразрывных пробелов:
Обработка различий между часовыми поясами становится все более важной для всех приложений, которые работают с датами и временем. Приложение больше не может считать, что все значения времени могут быть выражены в местном времени, которое является временем, доступным в DateTime структуре. Например, веб-страница, которая отображает текущее время в восточной части США, будет содержать недостоверные сведения для пользователей в восточной Азии. В этом разделе объясняется, как преобразовать время из одного часового пояса в другой, а также как преобразовать DateTimeOffset значения с ограниченной поддержкой часовых поясов.
Преобразование во время в формате UTC
Можно также сериализовать DateTimeOffset структуру для однозначного представления одного момента времени. Поскольку DateTimeOffset объекты хранят значение даты и времени вместе со смещением от времени в формате UTC, они всегда представляют определенный момент времени в связи с временем в формате UTC.
самый простой способ преобразовать время в формат UTC — вызвать static Shared метод (в Visual Basic) TimeZoneInfo.ConvertTimeToUtc(DateTime) . Точное преобразование, выполняемое методом, зависит от значения dateTime Kind Свойства параметра, как показано в следующей таблице.
DateTime.Kind | Преобразование |
---|---|
DateTimeKind.Local | Преобразует местное время во время в формате UTC. |
DateTimeKind.Unspecified | Предполагает, что параметр dateTime является местным временем и преобразовывает местное время в UTC. |
DateTimeKind.Utc | Возвращает неизмененный параметр dateTime . |
Следующий код преобразовывает текущее местное время во время в формате UTC и выводит результат на консоль.
Если значение даты и времени не представляет ни местное время, ни время в формате UTC, то, ToUniversalTime скорее всего, метод вернет ошибочный результат. Однако можно использовать TimeZoneInfo.ConvertTimeToUtc метод для преобразования даты и времени из указанного часового пояса. (Дополнительные сведения о получении TimeZoneInfo объекта, представляющего часовой пояс назначения, см. в разделе Поиск часовых поясов, определенных в локальной системе.) В следующем коде используется TimeZoneInfo.ConvertTimeToUtc метод для преобразования восточного стандартного времени в формат UTC.
Обратите внимание, что этот метод создает исключение, ArgumentException Если DateTime Kind свойство объекта и часовой пояс не совпадают. Несоответствие возникает, если Kind свойство имеет значение DateTimeKind.Local TimeZoneInfo , но объект не представляет местный часовой пояс, или если свойство имеет значение, Kind DateTimeKind.Utc но объект не TimeZoneInfo равен TimeZoneInfo.Utc .
Все эти методы принимают DateTime значения в качестве параметров и возвращают DateTime значение. Для DateTimeOffset значений DateTimeOffset структура имеет ToUniversalTime метод экземпляра, который преобразует дату и время текущего экземпляра в формат UTC. В следующем примере вызывается ToUniversalTime метод для преобразования местного времени и нескольких других значений времени в формат UTC.
Преобразование времени в формате UTC в заданный часовой пояс
Для преобразования времени в формате UTC в местное время см. следующий раздел "преобразование времени UTC в местное время". Для преобразования времени в формате UTC во время в любом назначенном часовом поясе вызовите ConvertTimeFromUtc метод. Этот метод принимает два параметра:
Время в формате UTC, которое требуется преобразовать. Это должно быть DateTime значение, свойство которого равно Kind Unspecified или Utc .
Часовой пояс, в который требуется преобразовать время в формате UTC.
Следующий код преобразует время в формате UTC в центральное стандартное время.
Преобразование времени в формате UTC в местное время
Для преобразования времени в формате UTC в местное время вызовите ToLocalTime метод DateTime объекта, время которого необходимо преобразовать. Точное поведение метода зависит от значения Kind свойства объекта, как показано в следующей таблице.
DateTime.Kind | Преобразование |
---|---|
DateTimeKind.Local | Возвращает DateTime значение без изменений. |
DateTimeKind.Unspecified | Предполагается, что DateTime значение равно UTC и ПРЕОБРАЗУЕТ UTC в местное время. |
DateTimeKind.Utc | Преобразует DateTime значение в местное время. |
TimeZone.ToLocalTimeМетод ведет себя идентично DateTime.ToLocalTime методу. Он принимает один параметр, который представляет собой значение даты и времени для преобразования.
можно также преобразовать время в любом заданном часовом поясе в местное время с помощью static Shared метода (в Visual Basic) TimeZoneInfo.ConvertTime . Этот метод рассматривается в следующем разделе.
Преобразование между любыми двумя часовыми поясами
преобразование между любыми двумя часовыми поясами можно выполнить с помощью любого из следующих двух static Shared методов (в Visual Basic) TimeZoneInfo класса:
Параметры этого метода — это значение даты и времени для преобразования, TimeZoneInfo объект, представляющий часовой пояс значения даты и времени, и TimeZoneInfo объект, представляющий часовой пояс для преобразования значения даты и времени в.
Параметры этого метода — это значение даты и времени для преобразования, идентификатор часового пояса значения даты и времени и идентификатор часового пояса, в который необходимо преобразовать значение даты и времени.
Для обоих методов требуется, Kind чтобы свойство значения даты и времени было преобразовано, а TimeZoneInfo объект или идентификатор часового пояса, представляющий его часовой пояс, соответствовал друг другу. В противном случае возникает исключение ArgumentException. Например, если Kind свойство значения даты и времени равно DateTimeKind.Local , возникает исключение, если TimeZoneInfo объект, переданный в качестве параметра в метод, не равен TimeZoneInfo.Local . Исключение также создается, если идентификатор, переданный в качестве параметра в метод, не равен TimeZoneInfo.Local.Id .
В следующем примере используется ConvertTime метод для преобразования из Гавайского стандартного времени в местное время.
Преобразование значений DateTimeOffset
Значения даты и времени, представленные DateTimeOffset объектами, не имеют полной осведомленности о часовых поясах, так как объект не связан с часовым поясом во время создания экземпляра. Однако во многих случаях приложению достаточно преобразовать дату и время на основе двух различных значений смещения относительно времени в формате UTC, а не на основе времени конкретных часовых поясов. Чтобы выполнить это преобразование, можно вызвать метод текущего экземпляра ToOffset . Единственным параметром метода является смещение нового значения даты и времени, возвращаемого методом.
Например, если дата и время запроса пользователя к веб-странице известны и сериализованы в виде строки в формате мм/дд/гггг чч:мм:сс zzzz, то следующий метод ReturnTimeOnServer преобразует это значение даты и времени в значение даты и времени на веб-сервере.
Если методу передается строка "9/1/2007 5:32:07 -05:00", которая представляет дату и время в часовом поясе, который раньше пояса UTC на пять часов, он возвращает строку "9/1/2007 3:32:07 -07:00" для сервера, расположенного в тихоокеанском стандартном часовом поясе США.
UNIX-время или POSIX-время (англ. Unix time) - способ кодирования времени, принятый в UNIX и других POSIX-совместимых операционных системах.
Моментом начала отсчёта считается полночь (по UTC) с 31 декабря 1969 года на 1 января 1970, время с этого момента называют "эрой UNIX" (англ. Unix Epoch).
Время UNIX согласуется с UTC, в частности, при объявлении високосных секунд UTC соответствующие номера секунд повторяются.
Способ хранения времени в виде количества секунд очень удобно использовать при сравнении дат (с точностью до секунды), а также для хранения дат: при необходимости их можно преобразовать в любой удобочитаемый формат. Дата и время в этом формате также занимают очень мало места (4 или 8 байтов, в зависимости от размера машинного слова), поэтому его разумно использовать для хранения больших объёмов дат. Недостатки в производительности могут проявиться при очень частом обращении к элементам даты, вроде номера месяца и т. п. Но в большинстве случаев эффективнее хранить время в виде одной величины, а не набора полей.
Обычная дата(Human readable time) | Секунды |
1 минута | 60 секунд |
1 час | 3600 секунд |
1 день | 86400 секунд |
1 неделя | 604800 секунд |
1 месяц (30.44 дней) | 2629743 секунд |
1 год (365.24 дней) | 31556926 секунд |
Конвертивание эпохи Unix в человекопонятную дату(human readable date)
Unix дата начала и конца года, месяца или дня
Перевод секунд в дни, часы и минуты
Как получить Unix время в.
Конвертирование даты в Unix время в.
PHP | mktime(часы, минуты, секунды, месяц, день, год) |
Ruby | Time.local(год, месяц, день, часы, минуты, секунды, usec ) (или Time.gm для GMT/UTC вывода). Чтобы вывести добавьте .to_i |
Python | import time сначала, потом int(time.mktime(time.strptime('2000-01-01 12:34:00', '%Y-%m-%d %H:%M:%S'))) |
Java | long epoch = new java.text.SimpleDateFormat ("dd/MM/yyyy HH:mm:ss").parse("01/01/1970 01:00:00"); |
VBScript/ASP | DateDiff("s", "01/01/1970 00:00:00", поле даты) |
MySQL | SELECT unix_timestamp(время) Формат времени: YYYY-MM-DD HH:MM:SS или YYMMDD или YYYYMMDD |
PostgreSQL | SELECT extract(epoch FROM date('2000-01-01 12:34')); С timestamp: SELECT EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-08'); C интервалом: SELECT EXTRACT(EPOCH FROM INTERVAL '5 days 3 hours'); |
SQL Server | SELECT DATEDIFF(s, '1970-01-01 00:00:00', поле с датой) |
Unix/Linux | date +%s -d"Jan 1, 1980 00:00:01" |
Конвертирование Unix времеми в понятную дату(human readable date).
PHP | date(Формат, unix время); |
Ruby | Time.at(unix время) |
Python | import time сначала, потом time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.localtime(unix время)) Замените time.localtime на time.gmtime для GMT даты. |
Java | String date = new java.text.SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new java.util.Date (unix время*1000)); |
VBScript/ASP | DateAdd("s", unix время, "01/01/1970 00:00:00") |
PostgreSQL | SELECT TIMESTAMP WITH TIME ZONE 'epoch' + unix время * INTERVAL '1 second'; |
MySQL | from_unixtime(unix время, не обязательно, выходной формат) Стандартный формат выхода YYY-MM-DD HH:MM:SS |
SQL Server | DATEADD(s, unix время, '1970-01-01 00:00:00') |
Microsoft Excel | =(A1 / 86400) + 25569 Результат будет в GMT зоне времени. Для других временных зон: =((A1 +/- разница аремени для зоны) / 86400) + 25569. |
Linux | date -d @1190000000 |
Другие OS | Командная строка: perl -e "print scalar(localtime(unix время))" (Если установлен Perl) Замените 'localtime' на 'gmtime' для GMT/UTC зоны времени. |
Для чего нужен инструмент "Unixtime конвертер"?
Данный инструмент, в первую очередь, будет полезен веб-мастерам, которые постоянно имеют дело с большими объемами дат или часто в своей работе обращаются к их элементам. С помощью инструмента "Unixtime конвертер" можно легко конвертировать Unix время в понятную для пользователя дату (и наоборот), узнать текущее Unix epoch время, а также получить Unix время в различных языках программирования, СУБД и операционных системах.
Что такое Unix время?
Эра Unix (Unix epoch) началась в ночь с 31 декабря 1969 года на 1 января 1970 года. Именно эту дату взяли за точку отсчета "компьютерного" времени, которое исчисляется в секундах и занимает очень мало места на диске – всего 4 или 8 байт. С помощью такого способа кодирования программисты могут "спрятать" любую дату в одно число, и легко конвертировать его обратно в понятный пользователям формат.
Unix время (еще его называют Unix time или POSIX time) удобно использовать в различных операционных системах и языках программирования, так как оно отображается в виде одной величины, а не определенного количества полей, занимающих место. К тому же, UNIX time полностью соответствует стандарту UTC (в том числе и в високосных годах) – в таком случае соответствующие значения секунд просто повторяются.
Терминология Unix
Пару слов о терминах.
Итак, Unix-временем (или POSIX-временем) считается количество секунд, которые прошли с полуночи 1 января 1970 года до настоящего времени.
Unix Timestamp (временная метка) – это "зафиксированное" время, иными словами – конкретная дата, запечатленная в числе.
UTC (Universal Coordinated Time) – это Всемирное координированное время, которое "фиксируется" на нулевом меридиане, и от которого ведется отсчет географических часовых поясов.
Насколько "долговечна" данная система?
Всего лишь через пару десятков лет, а именно 19 января 2038 года в 03:14:08 по UTC Unix time достигнет значения 2147483648, и компьютерные системы могут интерпретировать это число как отрицательное. Ключ к решению данной проблемы лежит в использовании 64-битной (вместо 32-битной) переменной для хранения времени. В таком случае, запаса числовых значений Unix time хватит человечеству еще на 292 миллиарда лет. Неплохо, правда?
Unix время – одно для всех
Если вы живете в Лондоне или Сан-Франциско, а ваши друзья – в Москве, то "сверить часы" можно по Unix time: эта система в данный момент времени едина для всего мира. Естественно, если время на серверах выставлено правильно. А с помощью инструмента "Unixtime конвертер" такая конвертация займет у вас доли секунды.
Читайте также: