I knew that it is generally not a good idea to ask the Date constructor to parse a date string, since it might not know precisely the format of the string. For example, is 5/9/2018 the 9th of May or the 5th of September? Furthermore, there are timezone variations -- should the string be parsed as local timezone or UTC?
However, I also knew that the Date constructor accepts strings in the ISO 8601 format as well. They look like 2018-11-14T22:44:40. I thought that since the ISO 8601 format is unambiguously defined (including timezone, which is local unless specified) it should be safe to use the Date constructor to parse ISO 8601 date strings. Turns out I am wrong. Safari 12 (Mac & iOS) parses the string as UTC while Chrome 70 and Firefox 63 correctly treats the timezone as local.
So what can we do? I guess the best way out is to use a library. I tested date-fns on Safari, Chrome, and Firefox and it works correctly on all of them. For my project, I am fairly certain that the date string I have to parse is well-behaved, so I wrote a regex-based parser instead.