Moment.js - 显示选定范围内关于用户时区的历史数据
Moment.js - Displaying historical data from selected range with regard of user timezone
我对正确显示历史数据感到很困惑:
我有:
- 以 "YYYY-MM-DD HH:mm:ss" 格式和 UTC+0(MariaDB - 日期时间类型)存储的数据库记录
- Web 应用程序(使用 moment.js)允许用户选择两个日期之间的范围(没有时间部分)
我需要:
- 从选定范围内获取记录,但要考虑当前用户的时区(例如,他只选择 3 月 23 日的记录:在数据库中我有 3 月 22 日的记录,但在用户本地时区中它已经是 3 月 23 日了,所以如果我没记错的话,他也需要看那个记录)
- 正确处理 DST 废话
- 以正确的用户本地时间显示结果记录中的日期(就像过去那一刻一样)
我希望有某种指南可以向我解释我必须采取哪些步骤才能实现所有这些。谢谢!
在您的客户端代码中定义两个变量:
var startTime = moment().startOf('day').utc().format();
var untilTime = moment().add(1, 'day').startOf('day').utc().format();
您现在有了 UTC 的查询范围。通过表单 post 或您拥有的任何机制将它们发送到服务器,然后 运行 查询。
查询时,使用半开区间:recordTime >= startTime AND recordTime < untilTime
当您将结果返回给客户端时,您将获得 UTC 时间,因此请像这样转换为本地时间:
moment.utc(theData).local().format()
根据需要调整 input/output 格式。
下次,存储到 TIMESTAMP
而不是 DATETIME
。
TIMESTAMP
根据客户端时区将要插入的日期+时间转换成UTC存储。随后的 SELECT
根据 reader 的时区重新转换。
这样,就不需要代码来实现目标(我认为是这样)。
我对正确显示历史数据感到很困惑:
我有:
- 以 "YYYY-MM-DD HH:mm:ss" 格式和 UTC+0(MariaDB - 日期时间类型)存储的数据库记录
- Web 应用程序(使用 moment.js)允许用户选择两个日期之间的范围(没有时间部分)
我需要:
- 从选定范围内获取记录,但要考虑当前用户的时区(例如,他只选择 3 月 23 日的记录:在数据库中我有 3 月 22 日的记录,但在用户本地时区中它已经是 3 月 23 日了,所以如果我没记错的话,他也需要看那个记录)
- 正确处理 DST 废话
- 以正确的用户本地时间显示结果记录中的日期(就像过去那一刻一样)
我希望有某种指南可以向我解释我必须采取哪些步骤才能实现所有这些。谢谢!
在您的客户端代码中定义两个变量:
var startTime = moment().startOf('day').utc().format();
var untilTime = moment().add(1, 'day').startOf('day').utc().format();
您现在有了 UTC 的查询范围。通过表单 post 或您拥有的任何机制将它们发送到服务器,然后 运行 查询。
查询时,使用半开区间:recordTime >= startTime AND recordTime < untilTime
当您将结果返回给客户端时,您将获得 UTC 时间,因此请像这样转换为本地时间:
moment.utc(theData).local().format()
根据需要调整 input/output 格式。
下次,存储到 TIMESTAMP
而不是 DATETIME
。
TIMESTAMP
根据客户端时区将要插入的日期+时间转换成UTC存储。随后的 SELECT
根据 reader 的时区重新转换。
这样,就不需要代码来实现目标(我认为是这样)。