首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何正确地跨时区转换时间?

如何正确地跨时区转换时间?
EN

Stack Overflow用户
提问于 2013-08-02 10:10:20
回答 3查看 60.1K关注 0票数 14

假设用户在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小时,除了一年中的两个时段,标准和夏令模式之间有一个或另一个区域切换。

更新:

经过更多的思考和阅读这些评论,我理想中需要的是:

代码语言:javascript
运行
复制
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吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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插件似乎能够做到这一点(或多或少)。

力矩时区是一个很好的图书馆。但是,从您描述的场景来看,我不认为您需要像您所想的那样多地担心时区转换。看看你是否能遵循这个逻辑:

  1. 加利福尼亚的用户在文本框中输入日期和时间。
  2. 将该文本框值读入字符串,并将其解析为日期: var dt =新日期(“8/15/2013 10:00"); 或者使用moment.js: 变量m=矩(“8/15/2013 10:00","M/D/YYYY HH:mm");
  3. 因为这是在用户的计算机上完成的,所以JavaScript将自动假定这是一个本地日期和时间。您不需要提供任何偏移量或时区信息。
  4. 这确实意味着,由于DST转换,输入的时间可能无效或不明确。事实上,JavaScript在处理这方面做得不太好--在不同的浏览器上会得到不同的结果。如果您想要明确,那么您将提供一个偏移量。 // PST var dt =新日期(“3/11/2013 1:00 UTC-08:00");// PDT var dt =新日期(”3/11/2013 1:00 UTC-07:00");
  5. 一旦您有了一个Date (或一个moment),那么您就可以计算它的UTC等效值: var s= dt.toISOString();// 2013-08-15T17:00:00Z moment.js也是如此,但是您将有更好的浏览器支持: var s= m.toISOString();// 2013-08-15T17:00:00Z
  6. 将UTC值存储在数据库中。
  7. 中欧的另一个用户出现并加载数据。
  8. 将其输入到Date或JavaScript中的moment中: var dt =新日期(“2013-08-15T17:00:00Z”); 或者使用moment.js (同样,更好的浏览器支持) 变量m=矩(“2013-08-15T17:00:00Z”)
  9. 因为JavaScript知道本地计算机的时区规则,所以现在可以显示此日期,并且它将与中欧时区一起显示: var s= dt.ToString();// browser专用输出/ ex:“2013年8月15日清华19:00 GMT+0200 (中欧夏令时间)” 或者使用moment.js,您可以更好地控制输出格式。 var s= m.format("DD/MM/YYYY :mm“);// "15/08/2013 19:00” 您还可以让moment.js决定应该输出什么本地化格式: var s= m.format("llll");//“清华,2013年8月15日19:00”

总之,如果您只对转换到和从本地时区(无论是什么区域)感兴趣,那么您只需使用Date就可以做到这一切。Moment.js将使解析和格式化变得更容易,但并不是绝对必要的。

只有少数几种方案需要时区库(如矩时区或其他)。

  • 您想要转换到或来自非本地时区或UTC的区域。
  • 您正在处理过去的日期,并且从那时起时区规则或夏令时规则已经发生了更改,而且您的日期在新规则下的解释将与旧规则下的日期不同。这有点技术性,但确实发生了。阅读更多的这里这里
票数 23
EN

Stack Overflow用户

发布于 2013-08-02 10:23:51

默认构造函数创建本地时间实例。

代码语言:javascript
运行
复制
var localDate = new Date(); 

我现在不能测试它,但是您应该能够提供日期时间(作为构造函数的参数)。

代码语言:javascript
运行
复制
var eventDate = [SOMEDATE];
var localDate = new Date(eventDate);

然后,您应该能够调用像..and这样的Date对象函数,它返回本地时区中的数据。如写在:对象/日期

Note1:没有服务器=根本就没有服务器\db吗?如果存在,则应将日期保存为db中的UTC,并将其加载为每个用户的本地时间。这样你就不用担心转换了。

Note2:这个问题有一些代码展示了如何获得时区差异:如何获得客户的准确当地时间?

票数 1
EN

Stack Overflow用户

发布于 2017-09-22 01:24:02

我开发了这个解决方案的基础上的其他examples...hope,这是为您工作!可在小提琴上使用。

代码语言:javascript
运行
复制
/* 
* 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);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18014341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档