Power Automate formatDateTime: синтаксис, строки формата и примеры
By Mirko Peters ·
Разбираем formatDateTime в Power Automate: синтаксис, строки формата, которые действительно важны, часовые пояса с convertTimeZone и ошибки, из-за которых выводятся неверные дата и время.
Automatically translated with AI from the original post. Read the English original
Power Automate formatDateTime превращает дату и время в текст нужного вам вида. Синтаксис: formatDateTime(timestamp, format, locale), где формат и локаль необязательны, а результатом является строка. Например, formatDateTime(utcNow(), 'dd-MM-yyyy') возвращает текущую дату UTC в виде дня, месяца и года. Статья адресована тем, кто создаёт потоки и постоянно получает такие значения, как 2023-10-22T00:00:00Z, в письмах, именах файлов или столбцах SharePoint. Здесь рассмотрены синтаксис, строки формата, которые вы будете использовать чаще всего, ловушка с часовыми поясами, таблица распространённых шаблонов и ошибки, из-за которых результаты неверны.
Ключевые выводы
- Синтаксис: formatDateTime(timestamp, format, locale), где формат и локаль необязательны, а результат всегда является строкой.
- Без формата функция возвращает шаблон ISO 8601 round-trip, например 2018-03-15T00:00:00.0000000.
- Регистр в строках формата важен: MM — это месяц, а mm — минуты; HH — это 24-часовой формат часов, а hh — 12-часовой.
- Power Automate по умолчанию работает во времени UTC, поэтому сначала преобразуйте часовой пояс с помощью convertTimeZone или convertFromUtc, а затем форматируйте результат.
- Заключайте в одинарные кавычки литеральные значения и строки формата, но никогда не заключайте в них динамическое содержимое.
Как работает formatDateTime
Функция принимает метку времени и преобразует её по заданному формату. В статье Microsoft о форматировании значений даты и времени в потоке первый аргумент описан как дата и время, которые нужно отформатировать. Его можно ввести вручную или получить из динамического содержимого. Введённые вручную значения должны быть в формате ISO 8601, например 2009-06-15T13:45:30. Второй аргумент — строка формата. Один символ — это стандартная строка формата. Больше одного символа — пользовательская строка формата, которая управляет положением и точностью месяца, дня, года, часа, секунды и так далее.
Стоит запомнить три детали из справочника по выражениям рабочих процессов Microsoft:
- Формат необязателен. Если его не указать, по умолчанию используется шаблон
o, который Microsoft описывает как ISO 8601 с сохранением информации о часовом поясе.formatDateTime('03/15/2018')возвращает'2018-03-15T00:00:00.0000000'. - Недопустимый формат вызывает ошибку. Выполнение потока завершается с ошибкой, поэтому опечатка в шаблоне появится в журнале запусков.
- Локаль необязательна. Если её не указать, используется
en-us. Недопустимая локаль также приводит к ошибке. Так можно получить названия месяцев и дней на другом языке:formatDateTime('01/31/2016', 'dddd MMMM d', 'fr-fr')возвращает'dimanche janvier 31', тогда как тот же вызов без локали возвращает'Sunday January 31'.
Возвращаемое значение — строка, и на практике это важно. Как только вы отформатировали дату, у вас уже текст, и результат нельзя использовать для вычислений с датами. Сначала выполните расчёт с помощью функций, например addDays или addToTime, а форматируйте в самом конце. В Power Automate отформатированное значение обычно подставляют в текст письма, имя файла или текстовый столбец.
Как использовать formatDateTime в Power Automate пошагово
В статье Microsoft есть понятный способ вставить выражение в поток.
- Выберите поле ввода в действии, куда нужно поместить отформатированное значение, например Текст действия Отправка сообщения электронной почты (V2).
- Выберите Добавить динамическое содержимое, затем откройте вкладку Выражение. В конструкторе потоков она отображается как кнопка fx.
- Введите
formatDateTime(или найдите функцию в списке функций Дата и время. - Добавьте значение. Введите фиксированное значение в одинарных кавычках или выберите динамическое содержимое. Не ставьте одинарные кавычки вокруг динамического содержимого.
- Добавьте строку формата в одинарных кавычках, например
'MM/dd/yyyy'. - Выберите ОК, чтобы вставить выражение.
Шаблон со страницы Microsoft выглядит так: formatDateTime('2023-10-22', 'dd/MM/yyyy hh:mm tt') для фиксированного значения в кавычках. Тот же вызов с элементом динамического содержимого вместо значения в кавычках пишется без кавычек.
В примере из статьи используется поток, который запускается вручную, с входным полем Date. Выражение: formatDateTime(triggerBody()?['date'], 'MM/dd/yyyy'). При дате 2023-10-22 в письме дата отображается в формате MM/dd/yyyy.
Чтобы проверить выражение перед тем, как строить на нём логику, добавьте действие Compose с фиксированной меткой времени в одинарных кавычках, запустите поток и посмотрите результат в истории запусков. Это займёт минуту и избавит вас от исправления неверного формата в потоке, который уже отправляет реальные письма.
Строки формата, которые вам действительно пригодятся
Стандартные строки состоят из одной буквы. Примеры Microsoft для метки времени 2009-06-15T13:45:30:
'g'возвращает6/15/2009 1:45 PM, общий шаблон даты и времени с коротким временем.'D'возвращаетMonday, June 15, 2009, длинный шаблон даты.
В документации .NET перечислено больше стандартных букв. Примеры для той же метки времени: 'd' даёт 6/15/2009, 't' даёт 1:45 PM, 'T' даёт 1:45:30 PM, 's' даёт сортируемый 2009-06-15T13:45:30, а 'Y' даёт June 2009. Большинство из них зависят от правил региональных параметров, поэтому одна и та же буква может выглядеть иначе при другой локали. Одинаково выглядят везде только o, r, s и u.
Пользовательские строки дают полный контроль над форматом. Ниже спецификаторы, которые важны для потоков:
yyyy— четырёхзначный год,yy— двузначный год.MM— месяц с ведущим нулём,MMM— сокращённое название месяца,MMMM— полное название месяца.M— месяц без ведущего нуля.dd— день с ведущим нулём,ddd— сокращённое название дня недели,dddd— полное название дня недели.HH— час в 24-часовом формате с ведущим нулём.hh— час в 12-часовом формате с ведущим нулём.mm— минуты,ss— секунды,fff— миллисекунды.tt— AM или PM.
По этой таблице formatDateTime('2009-06-15T13:45:30', 'yyyy-MM-dd') даёт 2009-06-15, а 'hh:mm tt' даёт 01:45 PM. В статье Microsoft о потоках также приведён пример formatDateTime(utcNow(), 'MMMM dd, yyyy, HH:mm'), который возвращает текущие дату и время в UTC в формате June 15, 2009, 16:50, при этом используется фиксированная примерная дата.
Два нюанса связаны с правилами .NET. Во-первых, одна буква всегда читается как стандартная строка формата. Если нужен одиночный пользовательский спецификатор, поставьте перед ним знак процента, например '%d'. Во-вторых, чтобы вставить фиксированный текст в шаблон, экранируйте символ обратной косой чертой или заключите текст в кавычки. Остальные символы, которые не являются спецификаторами, копируются в результат как есть. Косая черта и двоеточие заменяются разделителями локали, и это может удивить, если вы передаёте другую локаль.
Часовые пояса: форматируйте после преобразования
Power Automate по умолчанию использует UTC, а utcNow() возвращает текущие дату и время в UTC. Если ваши пользователи находятся в Берлине или Нью-Йорке, время в письме будет неверным, пока вы его не преобразуете.
В статье Microsoft эти функции объединены: formatDateTime(convertTimeZone(utcNow(), 'UTC', 'Eastern Standard Time'), 'yyyy-MM-dd HH:mm:ss'). Внутренняя функция меняет часовой пояс, внешняя форматирует результат. Названия часовых поясов – это названия Windows, например UTC, Pacific Standard Time и Eastern Standard Time. Для других регионов используйте соответствующее название часового пояса Windows из списка Microsoft.
В справочнике по рабочим процессам также описана функция convertFromUtc, которая принимает временную метку UTC и целевой часовой пояс и возвращает преобразованное время без смещения UTC. Пример из справки: convertFromUtc('2018-01-01T08:00:00.0000000Z', 'Pacific Standard Time') возвращает "2018-01-01T00:00:00.0000000". Есть и convertToUtc, которая работает в обратном направлении. Кроме того, в Power Automate есть действие Convert time zone с входными параметрами Base time, Source time zone, Destination time zone и необязательным Format string, если вы предпочитаете действие выражению.
Если входное значение не соответствует ISO 8601, ожидайте ошибку вида «The date time string must match ISO8601 format.». Типичная причина – дата, введённая как 15/03/2018. Для дат в локальном формате справочник описывает parseDateTime с локалью и форматом, например parseDateTime('21052019', 'fr-fr', 'ddMMyyyy'), которая возвращает '2019-05-21T00:00:00.0000000'. Сначала разберите дату, затем форматируйте.
Распространённые ошибки
- Использование
mmдля месяца. Строчноеmm– это минуты, аMM– месяц. Дата, отформатированная какdd/mm/yyyy, покажет минуты там, где должен быть месяц. - Сочетание
HHсtt. Пример самой Microsoft'M/dd/yyyy HH:mm:ss tt'даёт6/15/2009 13:45:30 PM, что противоречиво. Используйтеhhвместе сttилиHHбез него. - Заключение динамического содержимого в кавычки. Динамическое содержимое не должно содержать одинарных кавычек, иначе поток воспринимает имя как обычный текст.
- Забытый часовой пояс. По умолчанию используется UTC. Выполняйте преобразование до форматирования.
- Вычисления над результатом. Результат – это строка. Сначала вычисляйте, потом форматируйте.
- Доверие примерам результатов для
utcNow(). Даты в документации – это фиксированные примеры. Ваш результат отражает текущее время. - Передача даты не в формате ISO. Сначала разберите её с помощью локали и формата.
Связанные темы для изучения
- Преобразование часовых поясов: статья Microsoft о преобразовании часовых поясов описывает и действие, и выражение.
- Добавление и вычитание времени:
addDaysиaddToTimeпринимают тот же необязательный формат, поэтому можно сдвинуть дату и отформатировать её одним вызовом. - Разбор локальных форматов дат:
parseDateTimeпринимает локаль и формат для дат, которые не приходят в формате ISO 8601. - Полный список функций: в справочнике выражений рабочих процессов описана каждая функция для работы с датами и временем.
- Все пользовательские спецификаторы перечислены на странице Пользовательские строки формата даты и времени: там описана каждая буква.
Следующий шаг
Чтобы результаты formatDateTime в Power Automate были предсказуемыми, начните с даты в формате ISO 8601, переведите часовой пояс до форматирования и проверьте шаблон в действии Compose. Затем прочитайте статью Microsoft о том, как настроить или отформатировать значения даты и времени в потоке, и составьте короткий список шаблонов, которые чаще всего использует ваша команда.