Hoewel je in je Salesforce omgeving de tijdzone waarin je werkt wel goed kunt instellen, kun je soms toch verrast worden door een tijd die ineens in GMT blijkt te worden weergegeven.
Waarom en wanneer gebeurt dit?
Het probleem doet zich voor wanneer je een datum/tijd waarde gebruikt in een formule waarvan het output type niet datum/tijd is.
Standaard worden Datum/tijd waarden opgeslagen in de tijdzone GMT / UTC. Het omrekenen naar je lokale tijd, wordt eigenlijk door de Salesforce User Interface gedaan.
Met Salesforce Inspector Reloaded kun je dit snel in de praktijk zien. Zoek een willekeurig datum/tijd veld op in een record in je omgeving en bekijk daarna de waarde van ditzelfde veld via Salesforce Inspector. Wat er in je User Interface uitziet als 29-03-2023 12:00, blijkt onder water 2023-03-29T10:00:00.000+0000 te zijn.
Op het moment dat je deze Datum/Tijd waarde in een formule gebruikt en het output type is niet Datum/Tijd, dan is nooit vast te stellen of het zomertijd of wintertijd is en kan de juiste correctie dus niet berekend worden.
Dus wanneer je de Datum/Tijd waarde gebruikt om deze om te zetten in een Text of Tijd waarde, zul je de tijd in GMT zien en niet de tijd in je lokale tijdzone (als die afwijkt van GMT).
Als je de datum en tijd van een afspraak in een prettig leesbaar formaat in een email wilt opnemen, gebruik je daar waarschijnlijk een of meerdere formules voor die tekst of een tijd als uitvoer hebben.
Je wilt natuurlijk niet een onjuiste afspraaktijd aan de klant communiceren, dus kun je een correctie inbouwen op je formuleveld, maar je moet daarin ook nog rekening houden met of het nu zomertijd of wintertijd is.
Om te bepalen of de waarden van een Datum/Tijd veld in zomertijd of wintertijd is, is dit de formule die je nodig hebt. myDateTimeField
moet hierin het veld zijn waarvan je wilt weten of die Datum/Tijd in zomertijd of wintertijd is.
AND(
myDateTimeField
>
DATETIMEVALUE(
DATE(
YEAR( DATEVALUE( myDateTimeField ) ),
4,
1
) -
WEEKDAY(
DATE(
YEAR( DATEVALUE( myDateTimeField ) ),
3,
24
)
)
+ 3/24
),
myDateTimeField
<
DATETIMEVALUE(
DATE(
YEAR( DATEVALUE( myDateTimeField ) ),
11,
1
) -
WEEKDAY(
DATE(
YEAR( DATEVALUE( myDateTimeField ) ),
10,
24
)
)
+ 2/24
)
)
Kort uitgelegd is de uitkomst van deze formule true
wanneer myDateTimeField
ná 3:00 uur ’s nachts op de laatste zondag van maart is en vóór 2:00 uur ’s nachts op de laatste zondag van oktober.
Daar horen wel een paar kleine disclaimers bij:
- Het uur tussen 2:00 en 3:00 uur op de laatste zondag van maart bestaat niet (want om 2:00 uur gaat de klok vooruit en wordt het meteen 3:00 uur)
- Het uur tussen 2:00 en 3:00 uur op de laatste zondag van oktober bestaat in werkelijkheid eerst één keer in zomertijd en meteen daarna nóg een keer in wintertijd (want de eerste keer dat het 3:00 uur wordt, gaat de klok achteruit en wordt het meteen voor de tweede keer 2:00 uur)
- Op de laatste zondagen van maart en oktober tussen 1:00 en 3:00 is het gedrag van Salesforce met de Datum/Tijdwaarde onvoorspelbaar, dus vertrouw niet teveel op datumtijdwaarden binnen die uren.
- Voer je een tijd in van 1:45, dan zie je 0:45 staan nadat je hebt opgeslagen
- Op de laatste zondag van maart geeft de bovenstaande formule al na 1:00 uur zomertijd aan. Dat lijkt niet te corrigeren door in de formule nog eens 1 of 2 uur op te tellen bij de Datum/Tijdwaarde waarmee je
myDateTimeField
vergelijkt.
Elk Datum/Tijd veld heeft een eigen zomertijd test nodig
Let op dat je voor elk afzonderlijk Datum/Tijdveld moet controleren of de waarde van dát veld in zomer- of wintertijd valt.
Een losse formule waarmee je bepaalt of het NU wintertijd is, gaat je immers niet helpen om altijd de juist conversie te maken op een Datum/Tijd die niet NU is.
Voorbeeld
- Appointment_Date_Time__c = 20 april 13:00 uur
- isSummerTime__c is een formule die aangeeft of het NU zomertijd is
- AppointmentTimeText__c is een formule die de tijd van Appointment_Date_Time__c als tekst weergeeft
- Als de formule geschreven is zoals hieronder zal ik daar op 20 maart de output “12:00 uur” lezen, maar als ik op 1 april naar hetzelfde formuleveld kijk, staat er “13:00 uur”
TEXT(
HOUR( TIMEVALUE( Appointment_Date_Time__c ))
+
IF(
isSummerTime__c,
2,
1
)
) &
":" &
TEXT(
MINUTE( TIMEVALUE( Appointment_Date_Time__c ))
) &
" uur"
Een afzonderlijk isSummerTime veld is vanwege de kans op fouten geen goed idee. Beter schrijf je één integrale formule zoals:
TEXT(
HOUR( TIMEVALUE( Appointment_Date_Time__c ))
+
IF(
AND(
Appointment_Date_Time__c
>
DATETIMEVALUE(
DATE(
YEAR( DATEVALUE( Appointment_Date_Time__c ) ),
4,
1
) -
WEEKDAY(
DATE(
YEAR( DATEVALUE( Appointment_Date_Time__c ) ),
3,
24
)
)
+ 3/24
),
Appointment_Date_Time__c
<
DATETIMEVALUE(
DATE(
YEAR( DATEVALUE( Appointment_Date_Time__c ) ),
11,
1
) -
WEEKDAY(
DATE(
YEAR( DATEVALUE( Appointment_Date_Time__c ) ),
10,
24
)
)
+ 2/24
)
),
2,
1
)
) &
":" &
TEXT(
MINUTE( TIMEVALUE( Appointment_Date_Time__c ))
) &
" uur"