以用户的语言环境格式和时间偏移显示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来猜测偏移量。