如何跨多个时区按日期处理数据分组请求?

时间:2015-07-30 12:46:38

标签: mysql node.js sequelize.js

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

从请求中检索到1000-2000个条目,但我不需要完整的条目列表。我希望条目的摘要在条目生成之日被分组后,这些条目会缩减为数组中的大约5-10个对象。

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

你会如何处理这种情况?

3 个答案:

答案 0 :(得分:0)

将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

答案 1 :(得分:0)

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

在续集中,它会表达类似

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

答案 2 :(得分:0)

首先,感谢所有关于如何处理此问题的建议。最后,我通过以下方式解决了这个问题。

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

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

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

这是一个相当简单的解决方案 - 我被告知我花了很长时间才想出来。