Alexa 日历:Amazon Lambda 本地与 UTC 时区不匹配

Alexa calendar: Amazon Lambda local vs UTC timezone mismatch

我完成了从 ics 日历构建 Alexa Skill to read local events 的练习。一切正常,除了每当有事件在美国东部时间晚上 7 点或更晚开始时,该技能会在第二天读出它。

这似乎是时区问题。我在 Amazon Lambda 上托管逻辑,我相信它已设置为 UTC。将我的 Google 日历设置为 UTC 没有帮助。将 process.env.TZ = 'America/New_York' 添加到我的 JavaScript node.js 代码也无济于事。

我听说出于隐私原因,我无法发现 Alexa 用户的时区。但我不需要发现技能用户的时区,因为可以安全地假设他们都与我的本地事件日历 Eastern Daylight 处于同一时区。我需要做的就是让 lambda 知道当地时间晚上 7 点到午夜之间的事件不会在第二天发生。有什么想法我能做什么?谢谢

UTC 是过去、未来以及现在唯一明确且确定的时区。

这是唯一一个时区,例如,无论地方或国家政府采取何种行动,01:59:59后一秒的时间 永远不会在任何日期 是 03:00:00。 US/Eastern,另一方面,在 spring 中每年经历一次。相反,在秋天的一天中有两次挂钟时间 02:59:59 在一天中出现两次,相隔一小时。但是在 UTC 中,这两个时间由两个相隔 3600 秒的不同值正确表示,一个发生在另一个时间之后。

在设计处理日期时间的应用程序时,几乎没有争论的余地,即正确的解决方案是将日期时间存储为 UTC,然后使用时区库对其进行转换。转换为 UTC 是确保无损转换的唯一方法。

Google calendar follows this best practice 并且不会将您的事件存储在您当地的时区,而是将所有事件转换并存储为 UTC,然后再次转换并根据您日历的时区首选项显示它们。

如果 (?) 可以安全地假设用户希望听到基于 America/New_York 的事件,则使用时区库来转换系统的 date/time(任何服务器都应始终将其 "local" 时区设置为 UTC,Lambda 就是这种情况)和事件 date/times 从 UTC 到目标时区,然后再进行比较。

据推测,Google 日历 API 也可以查询您的时区首选项,您可以使用该值进行转换。或者你可以询问用户。