Dates and times are one of the most common problems programmers encounter - so why is it that we so often get this space wrong? Let's discuss where our current Date goes bad, better ways to model the date and time space in our code, and how the Temporal proposal making its way through TC39 helps us write correct code for every person in every time zone.
4. DID YOU KNOW…
• ABOUT THIS GREAT FALSEHOODS PROGRAMMERS BELIEVE ABOUT TIME VIDEO?
• THE PLACES WHERE MIDNIGHT DOESN’T EXIST?
• LEAP YEAR 2012 BRICKED EVERY ZUNE FOR A DAY?
• WE MIGHT COLONIZE MARS SOON? WE’LL NEED TIME THERE TOO!
• THERE’S SOME COUNTRY SOMEWHERE WHERE A WHOLE DAY IS MISSING DUE TO A TIME ZONE
CHANGE?
• THERE IS A GAP BETWEEN THE JULIAN AND GREGORIAN CALENDARDS?
5. YES. YES I DO.
"Soi dog - Bangkok" by ashabot is licensed under CC BY-NC-SA
6. AS PROGRAMMERS, WE OFTEN THINK ABOUT DATE AND TIME
PROBLEMS AS A SORT OF “FUN TRIVIA”.
7. GETTING THIS STUFF RIGHT MATTERS.
• DATE AND TIME PROBLEMS ARE PRIMARY APPLICATIONS IN COMPUTING
• GETTING THESE PROBLEMS WRONG PROFOUNDLY AFFECTS IMPORTANT STUFF
• PEOPLE GETTING PLACES ON TIME
• PAYCHECKS HAVING THE RIGHT AMOUNT OF MONEY
• COORDINATING INTERNATIONAL CONFERENCE CALLS
• MEDICAL DEVICE BEHAVIOR
• POOR PRACTICES IN DATE TIME PROGRAMMING DISPROPORTIONATELY AFFECT
• NON-ENGLISH SPEAKING PEOPLE
• HOURLY WAGE WORKERS
• PEOPLE IN OTHER TIME ZONES
10. MONTHS INDEX FROM ZERO?
let a = new Date(2019,12,3);
console.log(a.toISOString()); //2020-01-03T06:00:00.000Z
11. MUTABILITY
function addDays(date, days) {
date.setDate(date.getDay() + days)
return date;
}
let a = new Date('2019-12-03');
let b = addDays(a, 3);
console.log(a.toISOString()) // 2019-12-05T00:00:00.000Z
console.log(b.toISOString()) // 2019-12-05T00:00:00.000Z
12. TIME ZONE GAPS
I NEED TO MEET WITH THE SAN FRANCISCO OFFICE AT 9:00 THEIR TIME NEXT WEEK. WHAT TIME IS IT HERE?
NO IDEA.
console.log(new Date().toString())
// Tue Dec 03 2019 16:03:27 GMT-0600 (Central Standard Time)
console.log(new Date().toISOString())
// 2019-12-03T22:03:27.533Z
13. NO DATE-ONLY REPRESENTATION
let sulusBirthday = new Date('2014-09-12');
console.log(sulusBirthday.toDateString()); // Thu Sep 11 2014
14. INEXPLICABLE PARSE BEHAVIORS
let sulusBirthday = new Date('2014-09-12');
console.log(sulusBirthday.toISOString());
// 2014-09-12T00:00:00.000Z
let sulusBirthdayAtMidnight = new Date('2014-09-12T00:00:00')
console.log(sulusBirthdayAtMidnight.toISOString());
// 2014-09-12T07:00:00.000Z
17. “
”
A DOMAIN MODEL IS A SYSTEM OF
ABSTRACTIONS THAT DESCRIBES SELECTED
ASPECTS OF A SPHERE OF KNOWLEDGE,
INFLUENCE OR ACTIVITY
ERIC EVANS – DOMAIN DRIVEN DESIGN
WHAT IS A DOMAIN MODEL?
26. LOCAL TIME
TEMPORAL.DATETIME
• A LOCAL TIME IS A PERSPECTIVE OF TIME
• IT DOES NOT REPRESENT A POINT ON THE
GLOBAL TIMELINE
• IT OFTEN NOT A CONTIGUOUS TIMELINE
(DST, TIME ZONE SHIFTS)
27. DATETIME SCENARIOS
• DATES AND TIMES ON NON-CONNECTED DEVICES LIKE WATCHES, FITBITS, TIME CLOCKS OR
INSULIN PUMPS
30. TEMPORAL.TIMEZONE
• REPRESENTS ONE OF:
• UTC
• FIXED OFFSET (+01:00)
• IANA TIME ZONE (EUROPE/PARIS)
• KEEP IN MIND – AN IANA TIME ZONE IS A COLLECTION OF HISTORICAL OFFSETS OVER TIME
• WHEN COMBINED WITH AN ABSOLUTE OR A DATETIME, PRESENTS A COMPLETE PICTURE OF A
POINT IN TIME
• DATE AND TIME, LOCAL AND UTC
31. WHAT POINT IN TIME DID THIS INSULIN PUMP RUN
AT?
let timeFromDeviceString = '2019-12-05T08:12:03.001';
let userProvidedTz = 'Europe/Paris';
let localDateTime = Temporal.DateTime.from(timeFromDeviceString);
let timeZone = new Temporal.TimeZone(userProvidedTz);
let globalTime = timeZone.getAbsoluteFor(localDateTime);
33. TEMPORAL.DATE
• REPRESENTS A DATE WITHOUT A TIME
• PREVENTS ‘TIME ASSUMPTION’ ERRORS THAT CAUSE UNEXPECTED BEHAVIOR
• SCENARIOS:
• DATES OF BIRTH
• EMPLOYMENT HIRING DATES
• HOLIDAYS
• REPORT GROUPINGS
• “FOR THE BUSINESS DAY OF”
34. SULU’S BIRTHDAY – MADE BETTER
let birthday = Temporal.Date.from(‘2014-09-12');
console.log(birthday.toString()) //2014-09-12
let birthdayLong = Temporal.Date.from(‘2014-09-12T00:00:00.000');
console.log(birthdayLong.toString()) //2014-09-12
console.log(birthdayLong.day) // 12
console.log(birthdayLong.hour) // undefined
36. TEMPORAL.TIME
• REPRESENTS A TIME WITHOUT A DATE
• PREVENTS ‘DATE ASSUMPTION’ ERRORS THAT CAUSE UNEXPECTED BEHAVIOR
• SCENARIOS:
• RECURRING MEETING SCHEDULES
• DATA FROM NON-CONNECTED CLOCKS
37. FINDING UTC POINT-IN-TIME OF RECURRING
MEETING
let meeting1 = Temporal.Date.from('2020-01-01');
let meeting2 = Temporal.Date.from('2020-04-01');
let time = Temporal.Time.from('10:00:00');
let timeZone = new Temporal.TimeZone('Europe/Paris');
let absolute1 = timeZone.getAbsoluteFor(meeting1.withTime(time));
// 2020-01-01T09:00:00.000Z
let absolute2 = timeZone.getAbsoluteFor(meeting2.withTime(time));
// 2020-04-01T08:00:00.000Z
ProTip: Store recurring meeting times in local
and convert
39. TEMPORAL.DURATION
• USED TO EXPRESS LENGTHS OF TIME
• USEFUL TO FORMAT IN AND OF ITSELF
• “SHE WON THE RACE WITH A TIME OF 00:05:25.122”
• USED TO ADD AND SUBTRACT AMOUNTS OF TIME FROM ABSOLUTE, DATETIME, DATE, TIME
• RETURN VALUE OF A DIFFERENCE FUNCTION BETWEEN TWO ABSOLUTES OR DATES OR TIMES
40. EXACTLY HOW OLD IS MR SULU?
let birthday = Temporal.Date.from('2014-09-12');
let age = Temporal.getDate().difference(birthday);
// P5Y2M3W4D
42. YEAR/MONTH AND MONTH/DAY
• YEARMONTH IS USED TO REPRESENT REPORTING PERIODS, HISTORICAL TIMEFRAMES, ETC
• DECEMBER OF 2019
• MONTHDAY IS USED TO REPRESENT RECURRING DATES LIKE HOLIDAYS OR BIRTHDAYS
• MR SULU’S BIRTHDAY IS SEPTEBMBER 12
• NEW YEAR’S DAY IS JANUARY 1
43. ALTERNATE CALENDARS
• TC39 IS WORKING ON WAYS TO SUPPORT ALTERNATE CALENDAR SYSTEMS LIKE:
• HEBREW
• HIJRI
• JAPANESE
• AND MANY MORE
• THIS DISCUSSION IS VERY EARLY AND YOUR FEEDBACK WOULD BE VERY HELPFUL
• IF YOU USE A CALENDAR SYSTEM OTHER THAN GREGORIAN REGULARLY, WHEN AND HOW?
• HTTPS://GITHUB.COM/TC39/PROPOSAL-TEMPORAL/ISSUES/268
44. HOW DO WE GET THIS DONE?
STANDARDS AND THEIR PROCESSES
45. TEMPORAL IS
CURRENTLY
AT STAGE 2
• TC39 HAS A 4-STAGE PROCESS FOR MOVING PROPOSALS
FORWARD
• WHEN TEMPORAL REACHES STAGE 3, ENGINES WILL PICK IT
UP FOR A TEST IMPLEMENTATION
• UNTIL STAGE 3, APIS ARE INCREDIBLY UNSTABLE
• GOOD NEWS – AT A TOP LEVEL EVERYONE WANTS IT
46. CONTRIBUTING
• WE WELCOME CONTRIBUTIONS TO THE TEMPORAL SPECIFICATION AND POLYFILL
• YOU CAN FIND IT AT HTTPS://GITHUB.COM/TC39/PROPOSAL-TEMPORAL
• THE POLYFILL IS IN THIS REPO – CHECK IT OUT!
• WE WILL PUBLISH WHEN API IS STABLE
47. THANK YOU TO INCREDIBLE PEOPLE
• PHILIPP DUNKEL (BLOOMBERG)
• MATT JOHNSON-PINT (MICROSOFT)
• DANIEL EHRENBERG (IGALIA)
• RICHARD GIBSON (ORACLE)
• SHANE CARR (GOOGLE)
• BRIAN TERLSON (MICROSOFT)
• UJJWAL SHARMA (IGALIA)
• MS2GER (IGALIA)