rda*_*sky 14 javascript timezone datetime date timezone-offset
假设美国加州的用户选择了日期,时间和时区:
全球啤酒马拉松将于2013年8月15日上午10:00开始,UTC-08:00
中欧的另一个用户打开显示此日期和时间的页面.他不想做时间计算(已经喝了很少的啤酒).他只是想看看这个日期和时间:
2013年8月15日19:00
鉴于浏览器收到加州用户输入的日期和时间信息:
有没有办法在javascript中没有外部Web服务来进行正确的转换?也就是说,要检测到UTC时间上午10点UTC-08:00实际上应该是UTC-07:00上午10点,因为它是夏令时.
也许我从一开始就对此有了错误的理解,但我不想让进入的用户考虑是否应该选择UTC-08:00(太平洋标准时间)或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"
Run Code Online (Sandbox Code Playgroud)
到目前为止,看起来像Guido Preite建议的moment.js/timezone插件能够做到这一点(或多或少).
还有其他任何方式,使用浏览器API?
Mat*_*int 22
有没有办法在javascript中没有外部Web服务来进行正确的转换?也就是说,要检测到UTC时间上午10点UTC-08:00实际上应该是UTC-07:00上午10点,因为它是夏令时.
10:00-8和10:00-7是两个不同的时刻.它们分别等于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 Preite建议的moment.js/timezone插件能够做到这一点(或多或少).
Moment-timezone是一个很棒的图书馆.但是,从您描述的情景来看,我认为您不必像想象的那样担心时区转换.看看你是否可以遵循这个逻辑:
您将该文本框值读入字符串,并将其解析为日期:
var dt = new Date("8/15/2013 10:00");
Run Code Online (Sandbox Code Playgroud)
或使用moment.js:
var m = moment("8/15/2013 10:00", "M/D/YYYY HH:mm");
Run Code Online (Sandbox Code Playgroud)因为这是在用户的计算机上完成的,所以JavaScript会自动认为这是本地日期和时间.您无需提供任何偏移或时区信息.
这意味着由于DST转换,输入的时间可能无效或不明确.事实上,JavaScript在处理这方面做得不是很好 - 你会在不同的浏览器上得到不同的结果.如果你想明确,那么你会提供一个偏移量.
// PST
var dt = new Date("3/11/2013 1:00 UTC-08:00");
// PDT
var dt = new Date("3/11/2013 1:00 UTC-07:00");
Run Code Online (Sandbox Code Playgroud)一旦你有一个Date(或一个moment),那么你可以评估它的UTC等价物:
var s = dt.toISOString(); // 2013-08-15T17:00:00Z
Run Code Online (Sandbox Code Playgroud)
它与moment.js相同,但你会得到更好的浏览器支持:
var s = m.toISOString(); // 2013-08-15T17:00:00Z
Run Code Online (Sandbox Code Playgroud)您将该UTC值存储在数据库中.
中欧的其他用户出现并加载数据.
您将其输入到JavaScript Date或momentJavaScript中:
var dt = new Date("2013-08-15T17:00:00Z");
Run Code Online (Sandbox Code Playgroud)
或者使用moment.js(再次,更好的浏览器支持)
var m = moment("2013-08-15T17:00:00Z")
Run Code Online (Sandbox Code Playgroud)由于JavaScript知道本地计算机的时区规则,因此您现在可以显示此日期,并将显示中欧时区:
var s = dt.ToString(); // browser specific output
// ex: "Thu Aug 15 2013 19:00:00 GMT+0200 (Central Europe Daylight Time)"
Run Code Online (Sandbox Code Playgroud)
或者使用moment.js,您可以更好地控制输出格式
var s = m.format("DD/MM/YYYY HH:mm"); // "15/08/2013 19:00"
Run Code Online (Sandbox Code Playgroud)
你也可以让moment.js决定应该输出什么样的本地化格式:
var s = m.format("llll"); // "Thu, 15 Aug 2013 19:00"
Run Code Online (Sandbox Code Playgroud)总结一下 - 如果您只对转换到本地时区(可能是任何区域)感兴趣,那么您可以只使用它来完成所有操作Date.Moment.js将使解析和格式化变得更容易,但并不是绝对必需的.
只有少数场景需要时区库(例如时刻时区或其他).
您希望转换为非本地时区或UTC的区域.
您正在使用过去的日期,并且从那时起对时区规则或夏令时规则进行了更改,并且您在新规则下的日期与旧规则的解释方式不同.这有点技术性,但它确实发生了.在这里和这里阅读更多.
| 归档时间: |
|
| 查看次数: |
55566 次 |
| 最近记录: |