【问题标题】:User current time用户当前时间
【发布时间】:2015-09-17 20:55:10
【问题描述】:

我有一个脚本来存储用户执行的操作。有一列包含日期时间,最初我使用的是 NOW(),但它使用的是服务器时间,与用户的实际时间相比,这要少几个小时。

所以我决定利用 JS 所能获得的时间。我是这样格式化的:

var now   = new Date(),                
    isnow = now.getFullYear() + '-' + ('0' + (now.getMonth() + 1)).slice(-2) + '-' + ('0' + now.getDate()).slice(-2) + ' ' + ('0' + (now.getHours() + 1)).slice(-2) + ':' + ('0' + now.getMinutes()).slice(-2) + ':' + ('0' + now.getSeconds()).slice(-2);

我已经测试过,虽然格式可以正常工作,但时间差了一个小时。是因为夏令时吗?如何获取用户的实际当地时间?

【问题讨论】:

  • 您应该使用 UTC,以便时间独立于用户的系统设置(假设时钟准确)。这消除了时区的任何问题,但系统时钟可能未设置为正确的时间。
  • 你使用now.getHours() + 1而不是now.getHours()有什么原因吗?
  • 同意@RobG ...我一直都在 GMT/UTC 然后 client-js UTC 时间 server-sql CURRENT_TIMESTAMP UTC 时间相同,甚至尽管客户端和服务器时钟显示不同的本地时间。 (“CURRENT_TIMESTAMP”是 ANSI 方式,而 NOW() 是特定于 mysql 的)。然后您的客户端 javascript 可以获取从服务器获取的 UTC 时间并以本地时间显示。

标签: javascript php mysql


【解决方案1】:

在你的代码中写道:

...('0' + (now.getHours() + 1)).slice(-2)...

尝试删除这个加一

您还可以通过以下方式检查夏令时:

if (now.dst()) { alert ("Daylight savings time!"); }

Date.prototype.stdTimezoneOffset = function() {
    var jan = new Date(this.getFullYear(), 0, 1);
    var jul = new Date(this.getFullYear(), 6, 1);
    return Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset());
}

Date.prototype.dst = function() {
    return this.getTimezoneOffset() < this.stdTimezoneOffset();
}

基于answer similar issue

【讨论】:

  • dst() 函数在哪里?
  • 我认为这个功能是基于Prototype的...我使用jQuery。但我想我可以重写它。
【解决方案2】:

您应该使用toISOString() 方法将Date 对象转换为ISO-8601 标准格式:

now.toISOString();

ISO-8601 日期格式将时间信息转换为一种通用形式,其中包括可选的时区信息(可能是问题的根源)。

【讨论】:

  • 我必须进一步格式化它,比如用空格替换“T”并在几秒钟后去除尾随字符。
  • @santa - 更改间距将是微不足道的,使用 ISO-8601 的重要部分是它已转换为 UTC 偏移量,因此您无需担心时区信息(这是当前的你的问题)。如果您想修改toISOSTring() 的功能,可以直接修改输出或修改此处提供的“polyfill”选项:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • 但如果我不知道用户的时区是什么,这可能是个问题。我也可以直接将 GMT 时间存储在我的 mysql 中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 2012-04-25
  • 2021-03-14
  • 2015-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多