时间戳当然应该以 UTC 格式存储。日期的格式取决于该时区的要求。时间戳通常以 UTC 格式存储,因此显示到其他时区的转换更容易且可能。
通过仅将时间戳作为 UTC 存储在数据库中,您可以有效地将时区仅作为视图关注点。所有关于时间比较的数学和逻辑都可以假设在全球范围内同步。剩下的只是客户知道它在哪里,它在哪里的规则是什么,然后只是吐出结果。例如,通过 Chrome 开发者控制台在 JavaScript 中:
var dateObj = new Date();
console.log(dateObj);
// spits out local time
// if you and 23 other people in every time zone across the planet created
// a date object simultaneously you'd all see a different number
// adapted to your local time zones
var utcInMillis = dateObj.getTime();
// gives UTC in milliseconds.
console.log(utcInMillis);
// if you and 23 other people in every time zone across the planet created
// that same date object `dateObj` simultaneously you'd see the same number
console.log(new Date().getTime() - utcInMillis);
// how many milliseconds passed since utcinMillis was recorded and now
var utcAsDateObj = 新日期(utcInMillis);控制台.log(utcAsDateObj); //这就是从UTC以毫秒格式恢复到日期//对象是多么容易
一般来说,在有现代 Web 技术或类似选项的情况下,最不痛苦的事情是将所有内容存储为 UTC,然后将时区严格作为一个表示关注点。除了在当地环境中显示某人的时间外,您不需要任何本地时间。
即使您在后端遇到了一些愚蠢的非 UTC 时间戳,仍然值得通过在入口点转换并在出口点以任何可能的方式转换回客户端,使 UTC 成为您在客户端的规范化选项。整理出时区以及在哪些地方采用夏令时以及在哪些地方忽略它对 DIY 来说太混乱了,如果你真的必须触摸你需要变得更花哨的日期对象,这通常是不可避免的最终实际操作/比较日期/时间。
没有比将所有内容规范化为 UTC (以毫秒为单位)更简单的方法了,然后您将其作为当地时间在页面上吐出。