Javascript 如何跨时区正确转换时间?
假设美国CA的用户选择了一个日期、时间和时区: 全球啤酒马拉松赛于2013年8月15日UTC-08:00上午10:00开始 中欧的另一个用户打开显示此日期和时间的页面。他不想计算时间(已经没有几瓶啤酒了)。他只是想看看这个日期和时间: 2013年8月15日19:00 如果浏览器收到加利福尼亚州用户输入的日期和时间信息: 在javascript中,有没有一种方法可以在没有外部web服务的情况下进行正确的转换?也就是说,检测上午10点UTC-08:00实际上应该是上午10点UTC-07:00,因为它是夏令时 也许我从一开始就错误地理解了这一点,但我不想让输入的用户思考他应该选择UTC-08:00(PST)还是UTC-07:00(PDT)。我假设,由于CA中的标准时区是PST,人们在夏季不会转而使用PDT进行思考。还是他们 在中欧,标准日期为UTC+01:00,夏令时日期为UTC+02:00。所以CA和欧洲之间的差异应该是9小时,除了一年中的两个时段,当一个或另一个地区在标准和夏令时模式之间切换时 更新: 在仔细思考和阅读评论之后,我最理想的需要是:Javascript 如何跨时区正确转换时间?,javascript,date,datetime,timezone,timezone-offset,Javascript,Date,Datetime,Timezone,Timezone Offset,假设美国CA的用户选择了一个日期、时间和时区: 全球啤酒马拉松赛于2013年8月15日UTC-08:00上午10:00开始 中欧的另一个用户打开显示此日期和时间的页面。他不想计算时间(已经没有几瓶啤酒了)。他只是想看看这个日期和时间: 2013年8月15日19:00 如果浏览器收到加利福尼亚州用户输入的日期和时间信息: 在javascript中,有没有一种方法可以在没有外部web服务的情况下进行正确的转换?也就是说,检测上午10点UTC-08:00实际上应该是上午10点UTC-07:00,因为它
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"
到目前为止,GuidoPreite建议的方法似乎能够做到这一点(或多或少)
任何其他方式,使用浏览器API?默认构造函数创建本地时间实例
var localDate = new Date();
我现在无法测试它,但您应该能够提供您的datetime(作为构造函数的参数)
…然后您应该能够调用日期对象函数,如getMonth,它返回本地时区的数据。载于:
注1:没有服务器=根本没有服务器| db?如果有,则日期应保存为数据库中的UTC,并加载为每个用户的本地时间。。这样你就不用担心转换了
注2:此问题有一些代码显示如何获取时区差:
在javascript中,有没有一种方法可以在没有外部web服务的情况下进行正确的转换?也就是说,检测上午10点UTC-08:00实际上应该是上午10点UTC-07:00,因为它是夏令时
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小时。不过,它们在完全不同的时间切换,所以不要试图自己管理
到目前为止,GuidoPreite建议的moment.js/timezone插件似乎能够做到这一点(或多或少)
这是一个很棒的图书馆。然而,从您描述的场景来看,我认为您不必像您所想的那样担心时区转换。看看是否可以遵循以下逻辑:
var dt = new Date("8/15/2013 10:00");
或者使用moment.js:
var m = moment("8/15/2013 10:00", "M/D/YYYY HH:mm");
// 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");
日期
(或时刻
),就可以评估其UTC等效值:
var s = dt.toISOString(); // 2013-08-15T17:00:00Z
与moment.js相同,但您将获得更好的浏览器支持:
var s = m.toISOString(); // 2013-08-15T17:00:00Z
日期
或时刻
:
var dt = new Date("2013-08-15T17:00:00Z");
或者使用moment.js(同样,更好的浏览器支持)
var s = dt.ToString(); // browser specific output
// ex: "Thu Aug 15 2013 19:00:00 GMT+0200 (Central Europe Daylight Time)"
或者使用moment.js,您可以更好地控制输出格式
var s = m.format("DD/MM/YYYY HH:mm"); // "15/08/2013 19:00"
您还可以让moment.js决定应该输出什么本地化格式:
var s = m.format("llll"); // "Thu, 15 Aug 2013 19:00"
日期
。js将使解析和格式化变得更容易,但它不是绝对必需的
只有少数场景需要时区库(例如时刻时区或其他)
- 您想要转换到t区或从t区转换
var s = m.format("DD/MM/YYYY HH:mm"); // "15/08/2013 19:00"
var s = m.format("llll"); // "Thu, 15 Aug 2013 19:00"
/* * 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); }