НейроАгент

Как отправить буквальное время в поле времени Salesforce из DataWeave

Узнайте, как отправлять буквальные значения времени в поля времени Salesforce из DataWeave без преобразования часового пояса. Исправьте проблему, когда Salesforce преобразует ваше время UTC в зависимости от настроек часового пояса пользователя.

Как отправить буквальное время в поле типа Time Salesforce из DataWeave без преобразования часового пояса?

Я использую MuleSoft для отправки данных в пользовательский объект Salesforce с полем Shift_End_Time__c типа Time. Моя исходная система предоставляет это время в виде строки UTC, например: “Shift_End_Time__c”: “05:30:00Z”.

Проблема:
Когда я отправляю это значение, Salesforce не сохраняет буквальное время “05:30”. Вместо этого он преобразует его в локальный часовой пояс моего пользователя. Например, когда я отправляю “05:30:00Z” (5:30 утра по Гринвичу), в интерфейсе Salesforce для пользователей в часовом поясе GMT+5:30 оно отображается как 11:00 утра.

Моя цель - чтобы Salesforce сохранял и отображал буквальное время “05:30:00”, независимо от настроек часового пояса любого пользователя, поскольку это время смены, которое должно быть независимым от часового пояса.

Что я пробовал:
Я попытался применить несколько преобразований в DataWeave, но все они приводят к одному и тому же неверному преобразованию:

  1. Преобразование в тип Time:
Shift_End_Time__c: item.ShiftEndTime as Time
  1. Преобразование в LocalTime (для удаления часового пояса):
Shift_End_Time__c: (item.ShiftEndTime as LocalTime)

Поле Salesforce определено как типа Time (не DateTime или Text). Мне нужно, чтобы время отображалось одинаково для всех пользователей независимо от их настроек часового пояса.

НейроАгент

Отправка буквального времени в поле времени Salesforce из DataWeave без конвертации часового пояса

При отправке буквального времени в поле времени Salesforce из DataWeave необходимо правильно форматировать время без информации о часовом поясе. Проблема возникает потому, что Salesforce интерпретирует суффикс “Z” как часовой пояс UTC и конвертирует его на основе настроек часового пояса пользователя. Чтобы хранить “05:30” буквально без конвертации, следует отправлять его как простую строку времени без индикаторов часового пояса, используя форматирование типа Time в DataWeave.

Содержание

Поведение поля времени Salesforce

Поля времени Salesforce предназначены для хранения буквальных значений времени без конвертации часового пояса, в отличие от полей DateTime, которые хранятся в формате UTC и конвертируются для отображения. Однако поведение конвертации, которое вы наблюдаете, указывает на то, что суффикс “Z” во входной строке интерпретируется API Salesforce как информация о часовом поясе.

Согласно Salesforce Stack Exchange, “поля времени в Salesforce не конвертируются в часовой пояс” и должны сохранять свое буквальное значение. Проблема, скорее всего, заключается в том, как преобразование DataWeave обрабатывает входные данные перед отправкой в Salesforce.

Основная причина проблемы конвертации часового пояса

Проблема возникает потому, что ваш входной данные содержат индикатор часового пояса “Z” (UTC), который указывает Salesforce интерпретировать это как время UTC. Когда пользовательский интерфейс Salesforce отображает это время, он конвертирует его на основе настроек часового пояса текущего пользователя.

Например:

  • Входные данные: “05:30:00Z” (5:30 утра UTC)
  • Пользователь в GMT+5:30 видит: 11:00 утра
  • Пользователь в GMT-5 видит: 12:30 утра предыдущего дня

Решение заключается в полном удалении информации о часовом поясе перед отправкой данных в Salesforce.

Правильные преобразования в DataWeave

Метод 1: Прямое преобразование типа Time

Наиболее прямой подход - преобразовать строку в тип Time в DataWeave, что автоматически удалит информацию о часовом поясе:

dw
%dw 2.0
output application/json
---
{
  "Shift_End_Time__c": "05:30:00Z" as Time { format: "HH:mm:ss" }
}

Это преобразует “05:30:00Z” в объект Time, который Salesforce может интерпретировать как буквальное время без конвертации часового пояса.

Метод 2: Работа со строками

Вы также можете напрямую манипулировать строкой, удаляя индикатор “Z”:

dw
%dw 2.0
output application/json
---
{
  "Shift_End_Time__c": replace("05:30:00Z", "Z$", "") as Time
}

Или более надежно:

dw
%dw 2.0
output application/json
---
{
  "Shift_End_Time__c": replace(item.ShiftEndTime, "Z$", "") as Time { format: "HH:mm:ss" }
}

Метод 3: Использование LocalTime с правильным форматированием

Другой подход - использование LocalTime, который не зависит от часового пояса:

dw
%dw 2.0
output application/json
---
{
  "Shift_End_Time__c": "05:30:00Z" as :localtime { format: "HH:mm:ss" }
}

Или для вашего конкретного случая использования с полем ввода:

dw
%dw 2.0
output application/json
---
{
  "Shift_End_Time__c": (item.ShiftEndTime as Time { format: "HH:mm:ss" })
}

Требования Salesforce API для полей времени

Согласно документации Salesforce Stack Exchange, поля времени должны форматироваться как простые строки времени без информации о часовом поясе. Формат “HH:mm:ss” обычно является приемлемым.

При использовании Salesforce API, поля времени ожидают:

  • Отсутствие индикаторов часового пояса (нет “Z”, “+05:30” и т.д.)
  • Стандартный 24-часовой формат (HH:mm:ss)
  • Отсутствие компонентов даты

Тестирование и валидация

Чтобы убедиться, что ваше преобразование работает правильно:

  1. Тестирование в консоли DataWeave: Сначала протестируйте ваше преобразование DataWeave в консоли MuleSoft DataWeave для проверки формата вывода.

  2. Использование Salesforce API Explorer: Протестируйте полезную нагрузку напрямую с помощью исследователя API Salesforce, чтобы подтвердить, что поле принимает формат.

  3. Проверка хранения: После отправки данных проверьте базу данных напрямую с помощью Salesforce Workbench, чтобы убедиться, что время хранится так, как вы ожидаете.

  4. Тестирование с разными часовыми поясами: Попросите пользователей с разными настройками часового пояса проверить, что время последовательно отображается как “05:30”.

Лучшие практики

  1. Валидация входных данных: Всегда проверяйте, что исходная система предоставляет время в согласованном формате перед обработкой.

  2. Обработка ошибок: Добавьте обработку ошибок для неверных форматов времени:

dw
%dw 2.0
output application/json
---
{
  "Shift_End_Time__c": (item.ShiftEndTime match {
    case /.*Z$/ -> replace(item.ShiftEndTime, "Z$", "") as Time { format: "HH:mm:ss" }
    case _ -> item.ShiftEndTime as Time { format: "HH:mm:ss" }
  })
}
  1. Документация: Задокументируйте ваш подход к преобразованию, чтобы другие разработчики понимали, почему вы используете определенные функции DataWeave.

  2. Согласованность: Применяйте одно и то же преобразование последовательно во всех интеграциях, взаимодействующих с этим полем Salesforce.

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


Источники

  1. Как отправить буквальное время в поле времени Salesforce из DataWeave без конвертации часового пояса? - Stack Overflow
  2. Какой правильный формат в mulesoft для обновления поля типа date в Salesforce через upsert API - Salesforce Stack Exchange
  3. Salesforce отображает поле времени в GMT вместо часового пояса пользователя - Salesforce Stack Exchange
  4. Форматирование дат в DataWeave 2.0 - Caelius Consulting
  5. Форматирование дат и времени | Документация MuleSoft
  6. Изменение часового пояса | Документация MuleSoft

Заключение

Чтобы успешно отправлять буквальные значения времени в поля времени Salesforce из DataWeave без конвертации часового пояса:

  • Удаляйте индикаторы часового пояса (такие как “Z”) перед отправкой в Salesforce
  • Используйте тип Time в DataWeave с правильным форматированием (HH:mm:ss)
  • Тщательно тестируйте с разными настройками часового пояса
  • Задокументируйте ваш подход для будущего обслуживания

Ключевое понимание заключается в том, что поля времени Salesforce должны получать простые строки времени без какой-либо информации о часовом поясе. Правильно форматируя вывод DataWeave для удаления данных о часовом поясе, вы гарантируете, что “05:30” останется “05:30” для всех пользователей, независимо от их индивидуальных настроек часового пояса.