以用户的语言环境格式和时间偏移显示日期/时间

IT技术 javascript datetime timezone
2021-01-28 19:55:29

我希望服务器始终在 HTML 中以 UTC 格式提供日期,并让客户端站点上的 JavaScript 将其转换为用户的本地时区。

如果我可以以用户的语言环境日期格式输出,那就再好不过了。

6个回答

似乎从 UTC 日期开始的最简单的方法是创建一个新Date对象并使用setUTC…方法将其设置为您想要的日期/时间。

然后各种toLocale…String方法将提供本地化的输出。

例子:

// This would come from the server.
// Also, this whole block could probably be made into an mktime function.
// All very bare here for quick grasping.
d = new Date();
d.setUTCFullYear(2004);
d.setUTCMonth(1);
d.setUTCDate(29);
d.setUTCHours(2);
d.setUTCMinutes(45);
d.setUTCSeconds(26);

console.log(d);                        // -> Sat Feb 28 2004 23:45:26 GMT-0300 (BRT)
console.log(d.toLocaleString());       // -> Sat Feb 28 23:45:26 2004
console.log(d.toLocaleDateString());   // -> 02/28/2004
console.log(d.toLocaleTimeString());   // -> 23:45:26

一些参考:

在 Firefox 中,toLocateDateString()返回类似于“2014 年 1 月 12 日星期日”的内容。
2021-03-14 19:55:29
很抱歉,但此方法在(我在澳大利亚)下不起作用,当我运行上述代码时,日期以美国格式显示。此外,MDN说“使用的语言环境和返回的字符串形式完全取决于实现”。
2021-03-20 19:55:29
上述初始化的单行版本: var d = new Date(Date.UTC(2004,1,29,2,45,26));
2021-03-25 19:55:29
嗯,是的,这是一个相当严重的问题。如果您希望日期在浏览器中看起来相同,则使用这些方法将不起作用。任何已知的替代方案?
2021-03-26 19:55:29
值得考虑的是,Chrome(从 v35 开始)在toLocaleString()函数中没有考虑用户的语言环境
2021-03-31 19:55:29

您可以使用moment.js(在 2021 年弃用)

最好按如下方式从 UTC解析您的日期字符串(在服务器上创建一个ISO-8601兼容字符串以在所有浏览器中获得一致的结果):

var m = moment("2013-02-08T09:30:26Z");

现在只需m在您的应用程序中使用,moment.js 默认使用本地时区进行显示操作。多种方法可以格式化日期和时间值或提取其中的一部分。

你甚至可以像这样在用户语言环境中格式化一个 moment 对象:

m.format('LLL') // Returns "February 8 2013 8:30 AM" on en-us

要将 moment.js 对象转换为不同的时区(即既不是本地时区也不是 UTC),您需要moment.js 时区扩展名该页面还有一些示例,使用起来非常简单。

注意:Moment JS 推荐更现代的替代方案,因此它可能不是新项目的好选择。

我建议添加 For old projects, just use jQuery
2021-03-15 19:55:29
你如何结合这一切?m.utcOffset(offset).format('LLL') 似乎不起作用。
2021-03-25 19:55:29
不适用于 chrome - 即使时间在计算机的区域设置中设置为 24 小时,仍然显示 am/pm
2021-03-25 19:55:29
是否应力信通Day.js现在是建议的图书馆吗?
2021-04-07 19:55:29
momentjs 已宣布弃用:momentjs.com/docs > 最近,Chrome Dev Tools 开始显示仅针对大小替换 Moment 的建议。我们普遍支持这一举措。
2021-04-08 19:55:29

您可以使用new Date().getTimezoneOffset()/60时区。还有toLocaleString()一种使用用户的语言环境显示日期方法。

这是整个列表:使用日期

@RobG 解决方案是什么而不是toLocaleString
2021-03-17 19:55:29
toLocaleString以用户可能期望的格式显示日期非常不可靠。即使在支持 ISO 402 的地方,它仍然非常不可靠并且格式基于语言,而不是区域设置。
2021-03-21 19:55:29
小吹毛求疵:你应该否定结果以获得以小时为单位的时区: -new Date().getTimezoneOffset()/60
2021-03-21 19:55:29
@user924——你可以使用图书馆,有很多可供选择。toLocaleString的问题在于,不同的实现给出了不同的结果,对各种语言和地区的支持水平不同。例如,我的系统默认语言不是 en-US,但某些浏览器的toLocaleString的默认格式是美国格式,其他人尊重我的系统语言。时区名称也是如此,只是更糟,因为它们根本没有标准化。:-(
2021-03-31 19:55:29

在 JS 中,除了如上所述转换每个属性之外,没有简单和跨平台的方法来格式化本地日期时间。

这是我用来获取本地 YYYY-MM-DD 的快速技巧。请注意,这是一个 hack,因为最终日期将不再具有正确的时区(因此您必须忽略时区)。如果我还需要其他任何东西,我会使用 moment.js。

var d = new Date();    
d = new Date(d.getTime() - d.getTimezoneOffset() * 60000)
var yyyymmdd = t.toISOString().slice(0,0); 
// 2017-05-09T08:24:26.581Z (but this is not UTC)

d.getTimezoneOffset() 以分钟为单位返回时区偏移量,而 d.getTime() 以毫秒为单位,因此 x 60,000。

@VG 我添加了更多关于 60k 来自哪里的信息。希望这有帮助。
2021-03-16 19:55:29

构建日期对象后,以下是转换的片段:

该函数采用 UTC 格式的 Date 对象和格式字符串。
您将需要一个Date.strftime原型。

function UTCToLocalTimeString(d, format) {
    if (timeOffsetInHours == null) {
        timeOffsetInHours = (new Date().getTimezoneOffset()/60) * (-1);
    }
    d.setHours(d.getHours() + timeOffsetInHours);

    return d.strftime(format);
}
@ChristoKiwi——传递给setHours的值预计是一个整数,getTimezoneOffset()/60可能会返回一个小数(例如,+05:30 的印度偏移将返回 5.5)。小数被截断。否则,设置小时数会更新其他值(将小时数设置为 48,看看会发生什么)。
2021-03-16 19:55:29
设置小时数对 Date 对象的 Day/Date/Year 部分有任何影响吗?好像没有
2021-03-26 19:55:29
你从哪里 strftime ?
2021-04-06 19:55:29