Skip to content

Instantly share code, notes, and snippets.

@gbutt
Created July 31, 2020 00:49
Show Gist options
  • Save gbutt/a13a342c3a1e71de402944c6a0c64668 to your computer and use it in GitHub Desktop.
Save gbutt/a13a342c3a1e71de402944c6a0c64668 to your computer and use it in GitHub Desktop.
@IsTest(IsParallel = true)
public class TimezoneTest {
@TestSetup
static void makeData() {
update new User(Id = UserInfo.getUserId(), TimeZoneSidKey = 'America/Denver');
}
@IsTest
static void it_should_demonstrate_datetime_handling_with_timezones() {
// some timezones for our tests
Timezone gmttz = TimeZone.getTimeZone('GMT');
Timezone usertz = UserInfo.getTimeZone();
System.assertEquals('America/Denver', usertz.getID());
Timezone fijitz = TimeZone.getTimeZone('Pacific/Fiji');
// Create dates in different timezones - the Datetime object does not know about the timezone
// midnight Jan 1 in GMT
Datetime jan1Gmt = Datetime.newInstanceGmt(2020, 1, 1, 0, 0, 0);
// midnight Jul 1 in GMT
Datetime jul1Gmt = Datetime.newInstanceGmt(2020, 7, 1, 0, 0, 0);
// midnight Jan 1 in MST - user's local timezone
Datetime jan1Local = Datetime.newInstance(2020, 1, 1, 0, 0, 0);
// midnight Jan 1 in Fiji Time - gotta do some math to get this date into a specific time zone
// subtract timezone offset from gmt time to convert date to a specific timezone
Datetime jan1Fiji = Datetime.newInstance(jan1Gmt.getTime() - fijitz.getOffset(jan1Gmt));
// another way to get midnight Jan 1 in local time
Datetime localDatetime2 = Datetime.newInstance(jan1Gmt.getTime() - UserInfo.getTimeZone().getOffset(jan1Gmt));
System.assertEquals(jan1Local, localDatetime2);
// Timezone offsets are # of milliseconds from GMT.
// They require a datetime to know whether to use Daylight Time vs Standard Time
System.assertEquals(0, gmttz.getOffset(jan1Gmt));
System.assertEquals(-25200000, usertz.getOffset(jan1Gmt)); // Mountain Standard Time offset
System.assertEquals(-21600000, usertz.getOffset(jul1Gmt)); // Mountain Daylight Time offset
System.assertEquals(46800000, fijitz.getOffset(jan1Gmt)); // Fiji Standard Time offset
System.assertEquals(43200000, fijitz.getOffset(jul1Gmt)); // Fiji Daylight Time offset
// Time is # of milliseconds since Jan 1 1970 GMT
System.assertEquals(1577836800000l, jan1Gmt.getTime());
System.assertEquals(1577862000000l, jan1Local.getTime());
System.assertEquals(1577790000000l, jan1Fiji.getTime());
System.assertNotEquals(jan1Gmt.getTime(), jan1Local.getTime());
// GMT time = local time + offset
System.assertEquals(jan1Gmt.getTime(), jan1Local.getTime() + usertz.getOffset(jan1Gmt));
System.assertEquals(jan1Gmt, Datetime.newInstance(jan1Local.getTime() + usertz.getOffset(jan1Gmt)));
System.assertEquals(jan1Gmt.getTime(), jan1Fiji.getTime() + fijitz.getOffset(jan1Gmt));
System.assertEquals(jan1Gmt, Datetime.newInstance(jan1Fiji.getTime() + fijitz.getOffset(jan1Gmt)));
// datetimes can be formatted in a specific timezone
String dtFormat = 'yyyy-MM-dd\'T\'HH:mm:ss.SSS';
// format Jan 1 GMT in different timezones
System.assertEquals('2020-01-01T00:00:00.000', jan1Gmt.format(dtFormat, gmttz.getID()));
System.assertEquals('2019-12-31T17:00:00.000', jan1Gmt.format(dtFormat, usertz.getID()));
System.assertEquals('2020-01-01T13:00:00.000', jan1Gmt.format(dtFormat, fijitz.getID()));
// format Jan 1 MST in different timezones
System.assertEquals('2020-01-01T07:00:00.000', jan1Local.format(dtFormat, gmttz.getID()));
System.assertEquals('2020-01-01T00:00:00.000', jan1Local.format(dtFormat, usertz.getID()));
System.assertEquals('2020-01-01T20:00:00.000', jan1Local.format(dtFormat, fijitz.getID()));
// format Jan 1 Fiji in different timezones
System.assertEquals('2019-12-31T11:00:00.000', jan1Fiji.format(dtFormat, gmttz.getID()));
System.assertEquals('2019-12-31T04:00:00.000', jan1Fiji.format(dtFormat, usertz.getID()));
System.assertEquals('2020-01-01T00:00:00.000', jan1Fiji.format(dtFormat, fijitz.getID()));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment