Created
July 31, 2020 00:49
-
-
Save gbutt/a13a342c3a1e71de402944c6a0c64668 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@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