【问题标题】:What is the standard for encoding a date as a timestamp?将日期编码为时间戳的标准是什么?
【发布时间】:2020-03-04 12:09:47
【问题描述】:
是否有将日期编码为时间戳的标准?我的想法:
-
这应该是当地时间下午 12:00 UTC,例如 T-3 上午 9:00,因此任何使用时间戳的人,无论他们的 -12/+12 偏移量如何,都会识别出相同的日期,无论它们是否在 UTC 时区解析
-
可能是 UTC 时间下午 12:00
-
这可能是世界标准时间一天的开始(凌晨 12:00)
-
可能是一天的开始(UTC 上午 12:00),例如 T-3 晚上 9:00
是否有要遵守的官方规范或标准?
指向此文档并说“这是标准”很容易,而不是不知道并不得不改变我们的逻辑。
【问题讨论】:
-
请注意,当前时区延伸至 UTC +14:00 至 UTC -11:00 — 请参阅Time Zone Map。您仍然应该在任何设计中允许 UTC -12:00。 (另见维基百科List of UTC time offsets。)。这样做的一个结果是,对于给定的日期,例如 2019-01-01,将有大约 50 个小时的时间段,而某些地区正在调用该日期的当前时间(从 2019-01-01 00:00 开始: 00 +14:00 至 2019-01-01 23:59:59 -12:00)。
标签:
date
datetime
timezone
momentjs
datetimepicker
【解决方案1】:
对此没有标准,因为日期和时间戳在逻辑上是两个截然不同的概念。
- 日期涵盖当天的整个时间范围,而不是特定时间点。
- 对于一个人在任何给定时间点处于另一个时区的日期可能不同,但日期本身与时区没有任何关联。将日期可视化为日历上的一个正方形,而不是时间线上的一个点。
- 当将仅日期值分配给日期+时间值时,许多 API 将使用午夜 (
00:00) 作为默认时间。然而:
另外,您用momentjs 标记了您的问题。由于Moment 对象基本上是时间戳(不是日期),因此如果提供仅日期值,Moment.js 通常会分配一天的开始。所涉及的时区是决定实际是哪个时刻的关键,这说明了我之前的观点。
例如:
// Parsing as UTC
moment.utc('2019-09-08').format() //=> "2019-09-08T00:00:00Z"
// Parsing as Local Time (my local time zone is US Pacific Time)
moment('2019-09-08').format() //=> "2019-09-08T00:00:00-07:00"
// Parsing in a specific time zone (on a day without midnight)
moment.tz('2019-09-08', 'America/Santiago').format() //=> "2019-09-08T01:00:00-03:00"
另外请记住,有时 API 可能会被错误命名。 JavaScript Date 对象不是仅日期值,而是实际上是时间戳,就像一个时刻。