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

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

如果我可以使用用户的区域date格式输出奖励。

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

然后各种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

这个问题相当老旧,所以当时并不存在,但是对于新的项目来说,它简化了这么多的任务。

最好从UTC parsingdatestring,如下所示(在服务器上创buildISO-8601兼容string以在所有浏览器中获得一致的结果):

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

现在只需在应用程序中使用m ,moment.js默认为显示操作的本地时区。 有很多方法来格式化date和时间值或提取它的一部分。

你甚至可以像这样在用户区域设置一个矩形对象:

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

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

您可以使用new Date().getTimezoneOffset()/60作为时区。 还有一个toLocaleString()方法用于显示使用用户的语言环境的date。

以下是整个列表: 使用date

以下是我在过去的项目中使用的内容:

 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'); 

一旦你build立了date对象,下面是转换的一个片段:

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

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

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

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

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

重要细节:
请注意,夏令时是计入结果的因素 – 因此,此方法实际上是时间偏移量 – 而不是实际的地理时区偏移量。

我遇到的最好的解决scheme是创build[时间显示=“llll”datetime =“UTC时间”/]标签,并使用javascript(jquery)来parsing和显示它相对于用户的时间。

http://momentjs.com/ Moment.js

会很好地显示时间。

您可以使用以下几点,它报告从GMT以分钟为单位的时区偏移量:

 new Date().getTimezoneOffset(); 

注意: – 这个函数返回一个负数。

与PHP代码的date,我用这样的事情..

 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'); 

getTimeZoneOffset()和toLocaleString对于基本的date工作是很好的,但是如果你需要真正的时区支持,请看mde的TimeZone.js 。

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

在JS中,没有简单和跨平台的方式来格式化本地date时间,除了上面提到的转换每个属性。

这里是我用来获取本地YYYY-MM-DD的快速入门。 请注意,这是一个黑客,因为最后的date将不再有正确的时区(所以你必须忽略时区)。 如果我还需要其他东西,我使用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()以毫秒为单位,因此是60,000。

我将这些答案混合到目前为止,并添加到它,因为我不得不阅读所有的答案,另外调查了一段时间以用户的本地时区格式从数据库显示date时间string。

date时间string来自python / django数据库格式:2016-12-05T15:12:24.215Z

JavaScript中浏览器语言的可靠检测似乎不适用于所有浏览器(请参阅JavaScript来检测浏览器语言首选项 ),因此我从服务器获取浏览器语言。

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

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

HTML:将其写入一个隐藏的input:

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

JavaScript:获取隐藏的input值,例如en-GB,en-US; q = 0.8,en; q = 0.6 /然后通过replace和正则expression式

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

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

 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):05/12/2016,14:58

不知道如何做locale,但javascript是客户端技术。

 usersLocalTime = new Date(); 

将有客户的时间和date(由他们的浏览器,并扩展他们正在坐的计算机报告)。 在响应中包括服务器的时间应该是微不足道的,并且做一些简单的math来猜测偏移量。