使用JS和浏览器支持转换过去的日期时间

时间:2016-01-31 19:57:52

标签: javascript datetime timezone

不推荐使用

toLocaleString(),但似乎缺少替换

我有一个网站,我以这种格式存储会员发布日期:YYYY-MM-DD HH:MM:SS

问题是这些日期都是以时区UTC存储的,我想用JS将这些日期转换为用户操作系统时区。我知道我可以要求用户输入他们的时区,但我想尝试新的东西,这需要尽可能少的用户交互。该网站的目标是建立一个非常简单易用的论坛。

我几乎已经按照我想要的方式工作,但它目前只支持Chrome。这是不够好的,因为我计划有很多用户。

由于时区偏移量变化,仅仅检索当前时间偏移量是不够的,这里的许多主题似乎都表明了这一点。我想准确地显示例如注册日期。

这是我目前的解决方案(时区测试仅支持chrome,据我所知)它也在整个测试版的网站上实现。
https://ingsan.net/timezone/

下面的源代码

var d = new Date();
var tzName = d.toLocaleString('en', {timeZoneName:'short'}).split('').pop();

var cusid_ele = document.getElementsByClassName('timestamp');
for (var i = 0; i < cusid_ele.length; ++i) {
  var timestamp = cusid_ele[i];  
  timestamp.innerHTML += " "+tzName;
  t = new Date(timestamp.innerHTML);
  usertime = t.toLocaleString()
  timestamp.innerHTML = usertime;
}

我已经使用过这个网站多年没有询问,但这次我似乎无法找到一个与我相似的话题。

我使用的方法可能有问题,只是替换指定类名中的对象。我打算为其他格式输出做其他课程。

<p>Register date: <span class="timestamp">2016-01-31 20:12:55</span></p>

如果你有解决这个问题的方法,我将非常感激。我不专业,从来没有参加任何课程,但我已经设法自己制作ingsan.net。帮助一个不起眼的学生;)

1 个答案:

答案 0 :(得分:0)

如果你所做的只是从UTC转换到浏览器的本地时区,你不需要实际尝试找出时区。请确保您的输入明确标识为UTC,Date对象的默认行为是在浏览器的本地时区显示值。

var input = "2016-01-31 20:12:55";
var d = new Date(input + " UTC");
var s = d.toString();

结果字符串因实现和时区而异,例如(几个例子):

"Sun Jan 31 2016 12:12:55 GMT-0800 (Pacific Standard Time)"
"Sun Jan 31 2016 15:12:55 GMT-0500 (Eastern Standard Time)"
"Mon Feb 01 2016 01:42:55 GMT+0530 (India Standard Time)"
"Mon Feb 01 2016 09:12:55 GMT+1300 (New Zealand Daylight Time)"

这适用于所有浏览器。唯一的问题是您无法控制输出字符串的格式。这就是toLocaleString可以提供帮助的地方,但正如您所指出的那样 - 它并不一定在所有浏览器中实现。但是,您似乎认为它已被弃用,而事实并非如此。它实际上是新规范(ECMA-402)的一部分,它在各地(尚未)都没有广泛实施。

你还有其他选择。您可以自己构建输出字符串,如下所示:

var z = function(x) {return x < 10 ? '0' + x : x};
var s = d.getFullYear() + '-' + z(d.getMonth() + 1) + '-' + z(d.getDate()) + ' '
      + z(d.getHours()) + ':' + z(d.getMinutes()) + ':' + z(d.getSeconds());

当然你可以弄清楚如何调整为12小时格式,使用不同的分隔符,不同的日期字段排序(YMD与DMY对比MDY)等。

或者,您可以使用已配备的moment.js等库。

var input = "2016-01-31 20:12:55";
var m = moment.utc(input).local(); // parse as UTC, then switch to local mode
var s = m.format(); // use any of the format parameters you wish