【问题标题】:How to handle data grouping request by date across multiple time zones?如何跨多个时区按日期处理数据分组请求?
【发布时间】:2015-10-21 20:02:36
【问题描述】:

这是场景。我在服务器上使用 MySQL/NodeJS/Sequelize 堆栈,并且我有一个想要执行的请求。

从请求中检索到 1000-2000 个条目,但我不需要完整的条目列表。我想要按条目生成日期对条目进行分组后的摘要,这会在一个数组中浓缩为大约 5-10 个对象。

如果我在服务器上按天分组,它可能会与客户端的时区不同。如果我将它发送给客户端,那么我必须发送 1-2k 条目进行分析,但它会正确地将它们分组。

您将如何处理这种情况?

【问题讨论】:

    标签: mysql node.js sequelize.js


    【解决方案1】:

    对所有内容都使用 UTC 时间戳。例如打开 Chrome 控制台并输入:

    // Milliseconds since 1/1/1970
    new Date().getTime()
    1438263135084
    
    // Human friendly without timezone
    new Date().toISOString()
    "2015-07-30T13:32:15.715Z"
    
    // Human friendly with timezone
    new Date().toString()
    "Thu Jul 30 2015 09:32:21 GMT-0400 (EDT)"
    

    所有这些都是相同的(自 1970 年 1 月 1 日以来的时间),只是格式不同。使用前两个中的任何一个都可以让您发送可以正确解释和格式化的日期,无论时区如何。

    有趣的阅读:https://en.wikipedia.org/wiki/Coordinated_Universal_Time

    【讨论】:

    • 感谢您的回复!我一直在使用 UTC 处理一切。问题是如果我在服务器上按照日期分组,然后发送给客户端,服务器不知道客户端的一天开始和结束时间,所以它不会正确分组日期。这有意义吗?
    【解决方案2】:

    也许您可以将日期转换为用户的时区 Django MySQL group by day with timezone - 但这当然需要您知道用户的时区,并且缓存会更难

    在sequelize中,它会表达为

    sequelize.fn('CONVERT_TZ', sequelize.col('date'), 'UTC', user_tz)
    

    【讨论】:

      【解决方案3】:

      首先,感谢大家就如何处理此问题提出的建议。最终,我通过执行以下操作解决了这个问题。

      首先,在来自客户端的请求中,我使用了moment js方法.utcOffset()来获取偏移值。

      然后,一旦我有了偏移值,我将它作为 ?offset=(value here) 包含在 API 查询中

      最后,在服务器端,我使用这个值来解释客户端的本地时区偏移量,然后将那里的所有数据分组,并将格式化的数据发送回客户端。它产生了一个更快、更小、更小的响应查询。

      这是一个相当简单的解决方案 - 我觉得我花了很长时间才想出它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-03
        • 1970-01-01
        • 2016-08-03
        • 2019-01-20
        • 2018-08-19
        • 2013-01-12
        • 2013-01-31
        相关资源
        最近更新 更多