Формат 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С на примере месяца: прописью, без времени

Получить формат даты без времени:

Формат даты 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 конвертер" такая конвертация займет у вас доли секунды.

Читайте также: