Moment.js - 根据用户时区显示所选范围的历史数据

时间:2017-04-18 23:18:37

标签: javascript timezone momentjs mariadb dst

我对正确显示历史数据感到困惑:

我有什么:

  • 以“YYYY-MM-DD HH:mm:ss”格式存储的数据库记录以及UTC + 0(MariaDB - DateTime类型)
  • Web应用程序(使用moment.js),允许用户在两​​个日期之间选择范围(没有时间部分)

我需要什么:

  • 要从所选范围中获取记录,但要考虑当前用户的时区(例如,他仅从3月23日开始选择记录:在DB中我有3月22日的记录,但在用户本地时区它已经是3月23日,所以如果我正确思考,他也需要看到这个记录)
  • 正确处理DST废话
  • 以正确的当地时间显示结果记录中的日期(就像过去那一刻一样)

我希望有一些指南可以向我解释为实现这一切我必须采取的步骤。谢谢!

2 个答案:

答案 0 :(得分:0)

在客户端代码中定义两个变量:

var startTime = moment().startOf('day').utc().format();
var untilTime = moment().add(1, 'day').startOf('day').utc().format();

现在,您可以根据UTC获得查询范围。通过表单或任何机制将它们发送到服务器,然后运行查询。

查询时,请使用半开放范围:recordTime >= startTime AND recordTime < untilTime

当您将结果返回给客户端时,您将使用UTC格式,因此转换为本地时间如下:

moment.utc(theData).local().format()

根据需要调整输入/输出格式。

答案 1 :(得分:0)

下次,存储到TIMESTAMP而不是DATETIME

TIMESTAMP将根据客户端时区插入的日期+时间转换为UTC进行存储。后续的SELECT会根据读者的时区进行重新转换。

这样,实现目标就不需要代码了(正如我所认为的那样)。