Javascript Moment.js-显示所选范围内与用户时区相关的历史数据

Javascript Moment.js-显示所选范围内与用户时区相关的历史数据,javascript,timezone,momentjs,mariadb,dst,Javascript,Timezone,Momentjs,Mariadb,Dst,我对正确显示历史数据感到困惑: 我所拥有的: 以“YYYY-MM-DD HH:MM:ss”格式和UTC+0(MariaDB-日期时间类型)存储的数据库记录 Web应用程序(使用moment.js),允许用户选择两个日期之间的范围(不含时间部分) 我需要什么: 要从所选范围中获取记录,但要考虑当前用户的时区(例如,他只选择3月23日的记录:在DB中,我有一条3月22日的记录,但在用户本地时区中,它已经是3月23日了,因此如果我想对了,他也需要查看该记录) 正确处理DST的废话 在结果记录中以

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

我所拥有的:

  • 以“YYYY-MM-DD HH:MM:ss”格式和UTC+0(MariaDB-日期时间类型)存储的数据库记录
  • Web应用程序(使用moment.js),允许用户选择两个日期之间的范围(不含时间部分)
我需要什么:

  • 要从所选范围中获取记录,但要考虑当前用户的时区(例如,他只选择3月23日的记录:在DB中,我有一条3月22日的记录,但在用户本地时区中,它已经是3月23日了,因此如果我想对了,他也需要查看该记录)
  • 正确处理DST的废话
  • 在结果记录中以用户的正确本地时间显示日期(与过去相同)

我希望能得到一些指导,向我解释我必须采取哪些步骤来实现这一切。谢谢大家!

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

var startTime = moment().startOf('day').utc().format();
var untilTime = moment().add(1, 'day').startOf('day').utc().format();
您现在有了查询的UTC范围。通过form post或您拥有的任何机制将它们发送到服务器,然后运行查询

查询时,使用半开放范围:
recordTime>=startTime和recordTime

当您将结果返回给客户机时,您将获得UTC格式的结果,因此将其转换为本地时间,如下所示:

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

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

下次,将存储到
时间戳中,而不是
日期时间

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


这样,就不需要任何代码来实现目标(我认为是这样)。

您需要为您的工作提供基础。最低限度,包括“开始日期”和“结束日期”字段、您使用的日期格式以及预期结果。看到了。谢谢,但是像这样的情况呢:1。db上的记录日期为“2016-06-06 23:00:00”。2.当该事件发生时,用户本地时间(比如utc+2)已经是6月7日-“2016-06-07 01:00:00”。因此,在选择日期查看该记录时,他会选择2016-06-07,而不是2016-06-06,并且该记录不会显示。。。我知道在查询记录之前,我可以根据用户时区添加或减去特定偏移量,但DST呢?我怎么知道要选择什么偏移量呢?我给出的代码已经可以处理这个问题了。在客户端运行
moment()
时,您正在本地模式下工作,包括任何可能生效的时区偏移和DST。以本地时间计算一天的范围,然后将其转换为UTC。在服务器端,必须执行范围查询。根据您给出的示例,范围为从
2016-06-07 00:00:00
2016-06-08 00:00:00
当地时间,即从
2016-06-06 23:00:00
2016-06-07 23:00:00
UTC。它必须是一个范围查询。您无法按日历日期检查是否完全相等。这没有帮助,因为时区是web浏览器另一端的用户的时区,而不是连接到数据库的用户帐户。
TIMESTAMP
可能仍然是一个不错的选择,只有UTC和会话时区之间的转换对问题没有帮助,除非会话时区被相应地设置,从用户那里获得它可能是一件痛苦的事情。如果您想在存储日期时间时冻结TZ,那么请使用
日期时间
。(把
DATETIME
想象成本地时钟的图片。)现在我不明白原来的问题。