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

如果我可以以用户的区域设置日期格式输出,那就太好了。

有帮助吗?

解决方案

似乎从 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

一些参考:

其他提示

对于新项目,只需使用 moment.js

这个问题很老了,所以 moment.js 当时还不存在,但对于新项目来说,它大大简化了这样的任务。

最好是 解析 来自 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 时区扩展. 。该页面还有一些示例,使用起来非常简单。

您可以使用 new Date().getTimezoneOffset()/60 对于时区。还有一个 toLocaleString() 使用用户区域设置显示日期的方法。

这是整个列表: 使用日期

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

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

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

    return d.strftime(format);
}

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

这是我用来获取本地 YYYY-MM-DD 的快速技巧。请注意,这是一个黑客行为,因为最终日期将不再具有正确的时区(因此您必须忽略时区)。如果我还需要其他东西,我会使用 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。

这是我在过去的项目中使用过的:

var myDate = new Date();
var tzo = (myDate.getTimezoneOffset()/60)*(-1);
//get server date value here, the parseInvariant is from MS Ajax, you would need to do something similar on your own
myDate = new Date.parseInvariant('<%=DataCurrentDate%>', 'yyyyMMdd hh:mm:ss');
myDate.setHours(myDate.getHours() + tzo);
//here you would have to get a handle to your span / div to set.  again, I'm using MS Ajax's $get
var dateSpn = $get('dataDate');
dateSpn.innerHTML = myDate.localeFormat('F');

.getTimezoneOffset() 方法报告时区偏移量(以分钟为单位),从 GMT/UTC 时区“向西”计数,导致偏移值与通常习惯的值相反。(例如,纽约时间将报告为 +240 分钟或 +4 小时)

要获得正常的时区偏移量(以小时为单位),您需要使用:

var timeOffsetInHours = -(new Date()).getTimezoneOffset()/60

重要细节:
请注意,夏令时已计入结果中 - 因此此方法为您提供的实际上是 时间 偏移量 - 不是实际的地理 时区 抵消。

对于 PHP 代码中的日期,我使用了类似的东西..

function getLocalDate(php_date) {
  var dt = new Date(php_date);
  var minutes = dt.getTimezoneOffset();
  dt = new Date(dt.getTime() + minutes*60000);
  return dt;
}

我们可以这样称呼它

var localdateObj = getLocalDate('2015-09-25T02:57:46');

我将到目前为止的答案混合起来并添加到其中,因为我必须阅读所有答案并另外调查一段时间才能以用户的本地时区格式显示数据库中的日期时间字符串。

日期时间字符串来自 python/django 数据库,格式如下:12/05/2016 15:12:24

JavaScript 中浏览器语言的可靠检测似乎并不适用于所有浏览器(请参阅 用于检测浏览器语言偏好的 JavaScript),所以我从服务器获取浏览器语言。

Python/Django:发送请求浏览器语言作为上下文参数:

language = request.META.get('HTTP_ACCEPT_LANGUAGE')
return render(request, 'cssexy/index.html', { "language": language })

HTML:将其写入隐藏输入:

<input type="hidden" id="browserlanguage" value={{ language }}/>

JavaScript:获取隐藏输入的值,例如en-GB,en-US;q=0.8,en;q=0.6/ 然后仅通过替换和正则表达式获取列表中的第一种语言

const browserlanguage = document.getElementById("browserlanguage").value;
var defaultlang = browserlanguage.replace(/(\w{2}\-\w{2}),.*/, "$1");

JavaScript:转换为日期时间并格式化它:

var options = { hour: "2-digit", minute: "2-digit" };
var dt = (new Date(str)).toLocaleDateString(defaultlang, options);

看: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleDateString

结果是(浏览器语言为en-gb):2016/05/12, 14:58

我遇到的最好的解决方案是创建 [time display="llll" datetime="UTC TIME" /] 标签,并使用 javascript (jquery) 相对于用户时间来解析和显示它。

http://momentjs.com/ Moment.js

会很好地显示时间。

您可以使用以下命令,报告与 GMT 的时区偏移(以分钟为单位):

new Date().getTimezoneOffset();

笔记 :- 该函数返回负数。

getTimeZoneOffset() 和 toLocaleString 对于基本日期工作很有用,但如果您需要实时时区支持,请查看 mde 的 TimeZone.js.

答案中讨论了更多选项 这个问题

// new Date(year, monthIndex [, day [, hours [, minutes [, seconds [, milliseconds]]]]])
var serverDate = new Date(2018, 5, 30, 19, 13, 15); // just any date that comes from server
var serverDateStr = serverDate.toLocaleString("en-US", {
  year: 'numeric',
  month: 'numeric',
  day: 'numeric',
  hour: 'numeric',
  minute: 'numeric',
  second: 'numeric'
})
var userDate = new Date(serverDateStr + " UTC");
var locale = window.navigator.userLanguage || window.navigator.language;

var clientDateStr = userDate.toLocaleString(locale, {
  year: 'numeric',
  month: 'numeric',
  day: 'numeric'
});

var clientDateTimeStr = userDate.toLocaleString(locale, {
  year: 'numeric',
  month: 'numeric',
  day: 'numeric',
  hour: 'numeric',
  minute: 'numeric',
  second: 'numeric'
});

console.log("Server UTC date: " + serverDateStr);
console.log("User's local date: " + clientDateStr);
console.log("User's local date&time: " + clientDateTimeStr);

要将日期转换为本地日期,请使用 toLocaleDateString() 方法。

var date = (new Date(str)).toLocaleDateString(defaultlang, options);

要将时间转换为当地时间,请使用 toLocaleTimeString() 方法。

var time = (new Date(str)).toLocaleTimeString(defaultlang, options);

不知道如何进行区域设置,但 javascript 是一种客户端技术。

usersLocalTime = new Date();

其中将包含客户的时间和日期(由他们的浏览器报告,并通过扩展他们所坐的计算机)。将服务器的时间包含在响应中并进行一些简单的数学运算来猜测估计的偏移量应该很简单。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top