Lidar com fusos horários em operações de data e hora no Jitterbit Studio
Introdução
Os sistemas de origem armazenam timestamps em seu próprio fuso horário local. O Salesforce registra timestamps no fuso horário do usuário em execução; o NetSuite usa a configuração de fuso horário da empresa. Quando timestamps desses sistemas fluem para uma integração entre regiões sem conversão, erros silenciosos resultam: registros parecem ser criados horas no passado ou futuro, a deduplicação baseada em comparação falha e acionadores agendados disparam em momentos inesperados.
Este guia aborda três funções de data e hora que trabalham juntas para lidar com isso:
GetUTCFormattedDateTime: converte um timestamp local em uma string ISO 8601 UTC, adequada para armazenamento.ConvertTimeZone: desloca um timestamp de um fuso horário para outro, para entrega ou exibição.FormatDate: formata um timestamp convertido como uma string legível.
Dois padrões são abordados:
- Parte 1: Normalizar timestamps recebidos para UTC: Converter timestamps locais do sistema de origem para UTC na ingestão, de modo que todos os valores armazenados sejam independentes de fuso horário.
- Parte 2: Converter UTC para um fuso horário local para exibição: Deslocar timestamps UTC armazenados para o fuso horário local do destinatário e formatar para saída.
Padrão de design
As três funções são executadas dentro de scripts de mapeamento de campos de transformação. A estrutura da operação é a mesma para ambos os padrões:
A lógica de fuso horário fica no script de mapeamento de campos do campo timestamp no lado alvo. Nenhuma etapa de operação separada é necessária para a conversão de fuso horário.
Parte 1: Normalizar timestamps recebidos para UTC
Use GetUTCFormattedDateTime para converter um timestamp local do sistema de origem em uma string ISO 8601 UTC. Armazenar UTC elimina ambiguidade de fuso horário e permite comparações seguras entre registros de diferentes sistemas.
Passo 1: Identificar o fuso horário de origem
Determine qual fuso horário o sistema de origem usa para timestamps. Exemplos comuns:
- Salesforce: Timestamps usam o fuso horário do usuário cujas credenciais executam a integração. Verifique o fuso horário do usuário em Setup > Manage Users > Users.
- NetSuite: Timestamps usam o fuso horário padrão da empresa. Verifique isso em Setup > Company > Company Information.
Use um código IANA TZ completo ao especificar o fuso horário (por exemplo, "America/Los_Angeles" ou "Europe/London"). Abreviações como "PST" são suportadas, mas não recomendadas: "AST" é ambígua entre Atlantic Standard Time e Arabia Standard Time.
Uma lista completa de códigos IANA TZ está disponível em https://en.wikipedia.org/wiki/List_of_tz_database_time_zones.
Passo 2: Escrever o script de mapeamento
Na transformação, abra o mapeamento de campos do campo timestamp no lado alvo. Escreva um script que chame GetUTCFormattedDateTime com o campo de origem e o fuso horário de origem:
GetUTCFormattedDateTime(Source.created_at, "America/Los_Angeles");
// Se Source.created_at for "2024-03-15 09:00:00"
// Retorna "2024-03-15T17:00:00Z"
O valor de retorno sempre está em formato ISO 8601 (yyyy-mm-ddTHH:MM:SSZ). A maioria dos sistemas aceita ISO 8601 como um formato de timestamp padrão.
Nota
Se o timestamp de origem já estiver em UTC, passe "UTC" como o argumento time_zone_id. A função normaliza a string para formato ISO 8601 sem deslocar a hora.
Passo 3: Lidar com formato de data europeu (opcional)
Se o sistema de origem formatar datas como dia/mês/ano em vez de mês/dia/ano, defina o argumento opcional is_european_format como true:
GetUTCFormattedDateTime(Source.created_at, "Europe/London", true);
// Parses "15/03/2024 09:00:00" as 15 March 2024 at 09:00
// Returns "2024-03-15T09:00:00Z"
Nota
Se seu projeto usa Now() ou Now_() como argumento de data, esteja ciente de que a hora retornada reflete o fuso horário da máquina que executa o agente. Todos os agentes de nuvem são executados em UTC. Agentes privados usam o fuso horário da máquina local, que varia conforme a instalação. Leve isso em conta se seu projeto foi desenvolvido para ser executado em agentes de nuvem e privados.
Parte 2: Converter um timestamp UTC para o fuso horário local para exibição
Após armazenar timestamps em UTC, converta-os para o fuso horário local do destinatário ao enviar dados para um sistema de destino ou gerar uma notificação. Use ConvertTimeZone para deslocar a hora e, em seguida, FormatDate para produzir uma string legível.
Etapa 1: Converter para o fuso horário de destino
Use ConvertTimeZone para deslocar o timestamp em UTC para o fuso horário de destino. Atribua o resultado a uma variável local:
localTime = ConvertTimeZone(Source.updated_at, "UTC", "America/New_York");
// If Source.updated_at is "2024-03-15T17:00:00Z"
// Returns "2024-03-15 13:00:00"
Por padrão, ConvertTimeZone leva em conta o horário de verão ao converter entre os quatro principais fusos horários dos EUA. Para desabilitar esse comportamento, passe true como argumento opcional ignoreDST.
Etapa 2: Formatar o timestamp convertido
Use FormatDate para controlar como o timestamp aparece no campo de destino. O argumento de formato usa caracteres de espaço reservado para ano (yyyy), mês (mm), dia (dd), hora (HH), minuto (MM) e segundo (SS). Códigos no estilo strftime (por exemplo, %B para nome completo do mês) também são suportados.
Formatos comuns:
| String de formato | Saída de exemplo |
|---|---|
"yyyy-mm-dd HH:MM:SS" |
2024-03-15 13:00:00 |
"yyyy-mm-dd" |
2024-03-15 |
"HH:MM" |
13:00 |
"%B %d, %Y" |
March 15, 2024 |
Etapa 3: Combinar em um único script de mapeamento
No script de mapeamento de campo para o campo de exibição de destino, encadeie ambas as chamadas. Atribua o resultado de ConvertTimeZone a uma variável e, em seguida, retorne FormatDate dessa variável:
localTime = ConvertTimeZone(Source.updated_at, "UTC", "America/New_York");
FormatDate(localTime, "yyyy-mm-dd HH:MM:SS");
A última expressão em um script de mapeamento é seu valor de retorno, portanto FormatDate fornece o valor gravado no campo de destino.
Nota
Se seu projeto usa Now() ou Now_() como argumento de data para ConvertTimeZone, o mesmo comportamento de fuso horário do agente descrito em Parte 1 se aplica. Agentes de nuvem retornam a hora atual em UTC; agentes privados retornam a hora atual no fuso horário local da máquina.
Verificar a integração
Verificando a Parte 1 (normalizar para UTC)
-
Na transformação, adicione o script de mapeamento
GetUTCFormattedDateTimea um campo de timestamp de destino. -
Escolha um registro de origem com um timestamp local conhecido (por exemplo, um registro criado às 9:00 AM no horário do Pacífico).
-
Implante e execute a operação.
-
No log de operação ou no sistema de destino, confirme que o timestamp armazenado corresponde ao equivalente em UTC esperado (neste exemplo,
2024-03-15T17:00:00Zpara um deslocamento de Horário Padrão do Pacífico de −8). -
Teste com um timestamp próximo a uma transição de horário de verão no fuso horário de origem (por exemplo, um registro criado às 1:30 AM no horário do Pacífico no dia em que os relógios avançam). Confirme que o deslocamento de UTC muda corretamente.
-
Se o timestamp de saída for idêntico ao de entrada, confirme que o argumento
time_zone_idé um código IANA válido com capitalização correta. Um código de fuso horário não reconhecido faz com queGetUTCFormattedDateTimeretorne a entrada inalterada.
Verificando a Parte 2 (converter UTC para exibição)
-
Adicione o script de mapeamento
ConvertTimeZoneeFormatDatea um campo de exibição de destino. -
Use um registro de origem que contenha um timestamp UTC conhecido (por exemplo,
"2024-03-15T17:00:00Z"). -
Implante e execute a operação.
-
No sistema de destino, confirme que o campo de exibição mostra a hora local esperada para o fuso horário de destino (neste exemplo,
2024-03-15 13:00:00para horário do Leste). -
Teste com um timestamp UTC que caia próximo a uma transição de horário de verão no fuso horário de destino. Confirme que o deslocamento se ajusta corretamente.
-
Se a saída formatada for inesperada, verifique o argumento da string de formato para
FormatDate. Os caracteres que não são reconhecidos como espaços reservados de formato são gravados na saída como estão, o que pode produzir resultados inesperados quando uma string de formato contém um token não intencional.