假设用户在CA中,US获取日期、时间和时区:
世界啤酒马拉松在8/15/2013上午10:00开始,UTC-08:00
另一个用户,在中欧打开显示此日期和时间的页面。他不想计算时间(已经喝了几杯啤酒了)。他只想看看这个日期和时间:
8/15/2013 19:00
如果浏览器接收到日期和时间信息,正如加利福尼亚的用户输入的那样:
有没有方法,在javascript,没有外部web服务,做一个正确的转换?也就是说,要检测到世界协调时间上午10点-08:00实际上应该是上午10点-07:00,因为它是夏令。
也许我从一开始就误解了这一点,但我不想让输入的用户认为他应该选择UTC-08:00 (PST)还是UTC-07:00 (PDT)。我假设,由于CA中的标准时区是PST,所以人们不会在夏季切换到PDT中去思考。或者是他们?!
在中欧,标准日期为UTC+01:00,夏令日为UTC+02:00。因此,CA和欧洲之间的差别应该是9小时,除了一年中的两个时段,标准和夏令模式之间有一个或另一个区域切换。
更新:
经过更多的思考和阅读这些评论,我理想中需要的是:
var utcOffset = f('2013-08-15T10:00', 'America/Los_Angeles');
// utcOffset == "-07:00"
var utcOffset = f('2013-11-15T10:00', 'America/Los_Angeles');
// utcOffset == "-08:00"
到目前为止,Guido建议的./时区插件似乎能够做到这一点(或多或少)。
还有其他方式,使用浏览器API吗?
发布于 2013-08-02 16:17:54
有没有方法,在javascript,没有外部web服务,做一个正确的转换?也就是说,要检测到世界协调时间上午10点-08:00实际上应该是上午10点-07:00,因为它是夏令。
10:00-8和10:00-7 :00是两个不同的时刻。它们分别等于18:00Z和17:00Z (Z = UTC)。当您使用偏移量测量时,夏令时不会进入图片。永远不会。
我假设,由于CA中的标准时区是PST,所以人们不会在夏季切换到PDT中去思考。或者是他们?!
一般来说,人们只是在“太平洋时间”思考,这意味着冬季的PST和夏季的PDT。但电脑更精确。当你看到PST的时候,它意味着UTC-8。当你看到PDT的时候,意味着UTC-7。在使用一种形式同时引用另一种形式的偏移量时使用标签是无效的。
时区缩写可能是模棱两可。理想情况下,当以编程方式引用区域时,应该使用IANA区域名称,例如America/Los_Angeles
。但是,这在没有库的所有JavaScript运行时都是不可能的。(不过,他们正在进行这方面的工作。.)
在中欧,标准日期为UTC+01:00,夏令日为UTC+02:00。因此,CA和欧洲之间的差别应该是9小时,除了一年中的两个时段,标准和夏令模式之间有一个或另一个区域切换。
对,是这样。它们可能相隔8、9或10小时。但是,他们在完全不同的时间转换,所以不要试图自己管理这件事。
到目前为止,Guido建议的. is /timezone插件似乎能够做到这一点(或多或少)。
力矩时区是一个很好的图书馆。但是,从您描述的场景来看,我不认为您需要像您所想的那样多地担心时区转换。看看你是否能遵循这个逻辑:
Date
(或一个moment
),那么您就可以计算它的UTC等效值:
var s= dt.toISOString();// 2013-08-15T17:00:00Z
moment.js也是如此,但是您将有更好的浏览器支持:
var s= m.toISOString();// 2013-08-15T17:00:00ZDate
或JavaScript中的moment
中:
var dt =新日期(“2013-08-15T17:00:00Z”);
或者使用moment.js (同样,更好的浏览器支持)
变量m=矩(“2013-08-15T17:00:00Z”)总之,如果您只对转换到和从本地时区(无论是什么区域)感兴趣,那么您只需使用Date
就可以做到这一切。Moment.js将使解析和格式化变得更容易,但并不是绝对必要的。
只有少数几种方案需要时区库(如矩时区或其他)。
发布于 2013-08-02 10:23:51
默认构造函数创建本地时间实例。
var localDate = new Date();
我现在不能测试它,但是您应该能够提供日期时间(作为构造函数的参数)。
var eventDate = [SOMEDATE];
var localDate = new Date(eventDate);
然后,您应该能够调用像..and这样的Date对象函数,它返回本地时区中的数据。如写在:对象/日期上
Note1:没有服务器=根本就没有服务器\db吗?如果存在,则应将日期保存为db中的UTC,并将其加载为每个用户的本地时间。这样你就不用担心转换了。
Note2:这个问题有一些代码展示了如何获得时区差异:如何获得客户的准确当地时间?
发布于 2017-09-22 01:24:02
我开发了这个解决方案的基础上的其他examples...hope,这是为您工作!可在小提琴上使用。
/*
* Author: Mohammad M. AlBanna
* Website: MBanna.me
* Description: Get the current time in different time zone
*/
//Check daylight saving time prototype
Date.prototype.stdTimezoneOffset = function() {
var jan = new Date(this.getFullYear(), 0, 1);
var jul = new Date(this.getFullYear(), 6, 1);
return Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset());
}
Date.prototype.dst = function() {
return this.getTimezoneOffset() < this.stdTimezoneOffset();
}
var today = new Date();
var isDST = today.dst() ? true : false;
var pstOffset = isDST ? 7 : 8;
var cstOffset = isDST ? 5 : 6;
var estOffset = isDST ? 4 : 5;
var gmtOffset = 1;
pstOffset = pstOffset * 60 * 60 * 1000;
cstOffset = cstOffset * 60 * 60 * 1000;
estOffset = estOffset * 60 * 60 * 1000;
gmtOffset = gmtOffset * 60 * 60 * 1000;
var todayMillis = today.getTime();
var timeZoneOffset = (today.getTimezoneOffset() * 60 * 1000);
var curretPST = todayMillis - pstOffset;
var curretCST = todayMillis - cstOffset;
var curretEST = todayMillis - estOffset;
var curretGMT = todayMillis - gmtOffset;
addP("PST Time : " + new Date(curretPST).toUTCString());
addP("CST Time : " + new Date(curretCST).toUTCString());
addP("EST Time : " + new Date(curretEST).toUTCString());
addP("GMT Time : " + new Date(curretGMT).toUTCString());
addP("Local Time : " + new Date(today.getTime() - timeZoneOffset ).toUTCString());
function addP(value){
var p = document.createElement("p");
p.innerHTML = value;
document.body.appendChild(p);
}
https://stackoverflow.com/questions/18014341
复制相似问题