Nic*_*itz 549
var offset = new Date().getTimezoneOffset();
console.log(offset);
Run Code Online (Sandbox Code Playgroud)
时区偏移是UTC与本地时间之间的差异(以分钟为单位).请注意,这意味着如果本地时区落后于UTC,则偏移量为正,如果前置,则偏移量为负.例如,如果您的时区是UTC + 10(澳大利亚东部标准时间),则将返回-600.夏令时可以防止该值即使对于给定的区域设置也是常量
请注意,并非所有时区都按整个小时偏移:例如,纽芬兰是UTC减去3小时30分钟(将夏令时排除在等式之外).
Paw*_*iel 390
使用偏移量来计算时区是一种错误的方法,您将始终遇到问题.时区和夏令时规则可能会在一年内多次改变,并且很难跟上变化.
要在JavaScript中获得正确的时区,您应该使用
console.log(Intl.DateTimeFormat().resolvedOptions().timeZone)
Run Code Online (Sandbox Code Playgroud)
不幸的是,到撰写本文时,它还没有被广泛支持.
我知道它至少在Chrome中正常运行.
ecma-402/1.0表示timeZone
如果没有提供给构造函数,可能是未定义的.但是,未来的草案(3.0)通过更改为系统默认时区来解决该问题.
在此版本的ECMAScript Internationalization API中,
timeZone
如果timeZone
在提供给Intl.DateTimeFormat
构造函数的options对象中未提供任何属性,则该 属性将保持未定义.但是,应用程序不应该依赖于此,因为将来的版本可能会返回一个String值来标识主机环境的当前时区.
在ecma-402/3.0中,它仍然在草案中改为
在此版本的ECMAScript 2015 Internationalization API中,
timeZone
如果timeZone
在提供给Intl.DateTimeFormat
构造函数的options对象中未提供任何属性 ,则该 属性将是默认时区的名称 .timeZone
在这种情况下,之前的版本使 属性未定义.
因此,在使用它之前,请检查浏览器的当前支持,例如:https:
//developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DateTimeFormat/resolvedOptions
Mar*_*uez 120
我意识到这个答案有点偏离主题,但我想我们许多人在寻找答案时也希望格式化显示的时区,也许也会得到区域缩写.所以这里......
如果您希望客户端时区格式良好,您可以依赖JavaScript Date.toString方法并执行:
var split = new Date().toString().split(" ");
var timeZoneFormatted = split[split.length - 2] + " " + split[split.length - 1];
Run Code Online (Sandbox Code Playgroud)
例如,这将为您提供"GMT-0400(EST)",包括适用的时区分钟.
或者,使用正则表达式,您可以提取任何所需的部分:
对于"GMT-0400(EDT)":
new Date().toString().match(/([A-Z]+[\+-][0-9]+.*)/)[1]
Run Code Online (Sandbox Code Playgroud)
对于"GMT-0400":
new Date().toString().match(/([A-Z]+[\+-][0-9]+)/)[1]
Run Code Online (Sandbox Code Playgroud)
对于"EDT":
new Date().toString().match(/\(([A-Za-z\s].*)\)/)[1]
Run Code Online (Sandbox Code Playgroud)
对于"-0400":
new Date().toString().match(/([-\+][0-9]+)\s/)[1]
Run Code Online (Sandbox Code Playgroud)
Date.toString参考:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date/toString
cry*_*ryo 70
已经回答了如何以分钟为单位获得偏移量,但是如果有人希望将本地GMT偏移量作为字符串,例如"+1130"
:
function pad(number, length){
var str = "" + number
while (str.length < length) {
str = '0'+str
}
return str
}
var offset = new Date().getTimezoneOffset()
offset = ((offset<0? '+':'-')+ // Note the reversed sign!
pad(parseInt(Math.abs(offset/60)), 2)+
pad(Math.abs(offset%60), 2))
Run Code Online (Sandbox Code Playgroud)
Sam*_* Ek 62
您可以使用:
<script src="moment.js"></script>
<script src="moment-timezone-with-data.js"></script>
// retrieve timezone by name (i.e. "America/Chicago")
moment.tz.guess();
Run Code Online (Sandbox Code Playgroud)
浏览器时区检测相当棘手,因为浏览器提供的信息很少.
那一刻时区使用Date.getTimezoneOffset()
,并Date.toString()
围绕本年度时刻屈指可数收集关于浏览器环境中尽可能多的信息.然后,它将该信息与加载的所有时区数据进行比较,并返回最接近的匹配.如果是关系,则返回人口最多的城市的时区.
console.log(moment.tz.guess()); // America/Chicago
Run Code Online (Sandbox Code Playgroud)
Mr_*_*een 39
我在我的项目中编写了一个函数,它以hh:mm
格式返回时区.我希望这可以帮助某人:
function getTimeZone() {
var offset = new Date().getTimezoneOffset(), o = Math.abs(offset);
return (offset < 0 ? "+" : "-") + ("00" + Math.floor(o / 60)).slice(-2) + ":" + ("00" + (o % 60)).slice(-2);
}
Run Code Online (Sandbox Code Playgroud)
// Outputs: +5:00
Run Code Online (Sandbox Code Playgroud)
function getTimeZone() {
var offset = new Date().getTimezoneOffset(), o = Math.abs(offset);
return (offset < 0 ? "+" : "-") + ("00" + Math.floor(o / 60)).slice(-2) + ":" + ("00" + (o % 60)).slice(-2);
}
// See output
document.write(getTimeZone());
Run Code Online (Sandbox Code Playgroud)
Aid*_*din 17
这个问题已经有 30 多个答案,但我相信有些人会来到这里,但真的不知道他们在寻找什么。
\n惊喜!你即将打开一罐蠕虫!
\n我强烈建议阅读我最近写的这篇关于在 JS 中处理时区的令人头疼的文章!https://medium.com/@EyeDin/time-and-time-zone-headaches-in-javascript-ae4d873a665d
\n根据您的实际用例,您实际上需要不同的东西。
\n它具有比您想象的更多的格式化自定义参数,通过DateTimeFormat中列出的locale
和两个参数。它甚至支持不同的日历、语言、格式化年月日的方式等(没有传递的参数将使用用户的默认设置,这可能是理想的。)options
作为开发人员,只需将该时间点值(例如销售活动或竞赛的开始时间)作为UNIX 时间戳数字(即从 1970 年 1 月 1 日开始的秒数,采用 UTC 时区)传递即可。不可知和 DST0agnostic)到客户端,然后执行new Date(timestamp).toLocaleString()
. 例如,对于上面的时间点,该值是1636875321000
(以毫秒为单位),通过使用此答案+dateWithTimeZone("America/Los_Angeles",2021,10,13,23,35,21)
中的函数。
这是完全不同的要求!就像,非常非常不同!
\n不!
\n这只是用户在某个时间点所在的时区,例如“现在,今天”。
\n不!
\n首先,PDT 甚至不是全年都可以进行的。现在是 11 月,timeanddate.com说“目前 PDT 上没有位置。您想查看 PST 吗? ”(请阅读我上面的 Medium 文章了解更多详细信息。)
\n除非您想要从客户端到客户端的 UI 字符串,否则此 PDT/CEST/ 等。不值任何东西!
\n为什么?因为墨西哥的蒂华纳和美国的旧金山在 6 月份都处于 PDT,但它们的 DST(夏令时)日期不同,因此切换到 PST。你需要知道这一点!
\n2022年美国夏令时为2022年3月13日至2022年11月6日。墨西哥2022年夏令时日期为2022年4月3日至2022年10月30日。因此,虽然蒂华纳和旧金山在近 93% 的日子里共享“PDT/PST”,但在 7% 的日子里(例如 2022 年 3 月 14 日至 4 月 3 日,以及 10 月 31 日至 11 月 6 日),他们不\不匹配。
\n因此,即使您知道现在是 11 月并且知道用户处于 PDT,您也无法判断用户设备中的时间(哪个时间戳数字)是 2022 年 4 月 1 日上午 9 点。
\n附言。如果你想PDT
从new Date().toString()
. 仅供参考,如果您将计算机的区域设置更改为es-MX
(西班牙语,这是 13% 的美国人口的语言),您将得到以下结果:
> new Date().toString()\n\'Sun Nov 14 2021 00:47:25 GMT-0800 (hora est\xc3\xa1ndar del Pac\xc3\xadfico)\'\n
Run Code Online (Sandbox Code Playgroud)\n祝你好运hedP
!
唯一正确的方法是使用 IANA(读“标准”)时区值。这是该维基百科页面的第二栏。它来自:
\nconst timeZoneIANA = Intl.DateTimeFormat().resolvedOptions().timeZone;\n
Run Code Online (Sandbox Code Playgroud)\nAmerica/Los_Angeles
它返回旧金山的IANA 值。这是您应该为用户存储在数据库中的值(如果有的话)。您可以从timezones.json包中获取有关它的各种信息,并将时间从/到该时区转换,加上日期(这很重要),就像这个答案一样。
IE11 不支持那个Intl....
东西。大多数 Polyfill 只是猜测并且不准确。因此,请尝试放弃对 IE11 的支持,或者使用库,并为一些不准确的情况做好准备。
你可能不应该。我想不出你需要这个的任何真正原因。同样,知道今天的这个值并不能告诉您明天这个值会是多少。
\n无论如何,你总是可以通过以下方式获得该值
\nnew Date().getTimezoneOffset() / 60\n
Run Code Online (Sandbox Code Playgroud)\n在客户端。
\n注意:.getTimezoneOffset()不是日期对象的时区偏移量,您正在调用它。请阅读文档。
\n准确地说,它获取传递的 Date 对象(它有一个时间戳,指历史中的单个时间点),然后告诉该点的 UTC 时间和本地时间之间的差异-时间。
\n同样,这取决于日期。看:
\nconsole.log(new Date("6/13/2021").getTimezoneOffset() / 60); // It\'s 7 on a machine that runs in San Francisco\nconsole.log(new Date("11/13/2021").getTimezoneOffset() / 60); // It\'s 8 on a machine that runs in in San Francisco\n
Run Code Online (Sandbox Code Playgroud)\n以下是支持时区交换的库列表。
\n但是,请记住,您必须首先解决设计问题,然后再查找代码。时区方面的事情很容易变得复杂,您必须知道“PDT”和“GMT-8”不是全年为用户存储在数据库中的信息/有价值的时区值。:)
\ndfa*_*dfa 12
尝试getTimezoneOffset()
的的Date
对象:
var curdate = new Date()
var offset = curdate.getTimezoneOffset()
Run Code Online (Sandbox Code Playgroud)
此方法以分钟为单位返回时区偏移量,即GMT和本地时间之间的差值(以分钟为单位).
小智 11
尝试这个 :
new Date().toLocaleString("en-US",Intl.DateTimeFormat().resolvedOptions().timeZone)
Run Code Online (Sandbox Code Playgroud)
这将在您客户端的浏览器上查找 timeZone。
JavaScript的:
var d = new Date();
var n = d.getTimezoneOffset();
var timezone = n / -60;
console.log(timezone);
Run Code Online (Sandbox Code Playgroud)
同时提供偏移量和时区的单行代码是简单地在新的Date对象上调用toTimeString()。从MDN:
该
toTimeString()
方法以美国人可读的形式返回Date对象的时间部分。
问题是时区不是标准的IANA格式。它比“洲/城市” IANA格式更加人性化。试试看:
console.log(new Date().toTimeString().slice(9));
console.log(Intl.DateTimeFormat().resolvedOptions().timeZone);
console.log(new Date().getTimezoneOffset() / -60);
Run Code Online (Sandbox Code Playgroud)
在加利福尼亚州,现在,toTimeString()
回报Pacific Daylight Time
而国际API返回America/Los_Angeles
。在哥伦比亚,你会得到Colombia Standard Time
,主场迎战America/Bogota
。
请注意,此问题的许多其他答案尝试通过调用Date.toString()获得相同的信息。正如MDN解释的那样,这种方法并不可靠:
日期实例是指特定的时间点。调用toString()将以人类可读的格式返回使用美国英语格式的日期。[...]有时需要获取时间部分的字符串;用这种
toTimeString()
方法可以完成这样的事情。该
toTimeString()
方法是特别有用的,因为实现ECMA-262标准的发动机可以从所获得的字符串中不同toString()
为Date
对象,该格式是与实现有关的; 简单的字符串切片方法可能无法在多个引擎上产生一致的结果。
Intl.DateTimeFormat() 构造函数创建 Intl.DateTimeFormat 对象,该对象启用语言敏感的日期和时间格式设置。
Intl.DateTimeFormat().resolvedOptions().timeZone // Asia/Kolkata
Run Code Online (Sandbox Code Playgroud)
使用moment.js:
moment().format('zz');
Run Code Online (Sandbox Code Playgroud)
使用momentjs,您可以找到当前时区为
console.log(moment().utcOffset()); // (-240, -120, -60, 0, 60, 120, 240, etc.)
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdn.jsdelivr.net/momentjs/2.13.0/moment.min.js"></script>
Run Code Online (Sandbox Code Playgroud)
使用dayjs,您可以找到当前时区为
console.log(dayjs().utcOffset()); // (-240, -120, -60, 0, 60, 120, 240, etc.)
Run Code Online (Sandbox Code Playgroud)
<script src="https://unpkg.com/dayjs@1.8.10/dayjs.min.js"></script>
Run Code Online (Sandbox Code Playgroud)
两个API均以分钟为单位返回utc偏移量。
正如其他人提到的,要获取时区:
const tz = Intl.DateTimeFormat().resolvedOptions().timeZone
Run Code Online (Sandbox Code Playgroud)
之前没有提到,要获取时区的偏移量,请使用区域设置“ia”(请参阅/sf/answers/4498398831/)
const getOffset = (tz) => Intl.DateTimeFormat("ia", {
timeZoneName: "shortOffset",
timeZone : tz
})
.formatToParts()
.find((i) => i.type === "timeZoneName").value // => "GMT+/-hh:mm"
.slice(3); //=> +/-hh:mm
console.log(tz + ' UTC' + getOffset(tz))
Run Code Online (Sandbox Code Playgroud)
时区(以小时为单位)-
var offset = new Date().getTimezoneOffset();
if(offset<0)
console.log( "Your timezone is- GMT+" + (offset/-60));
else
console.log( "Your timezone is- GMT-" + offset/60);
Run Code Online (Sandbox Code Playgroud)
如果您想像评论中提到的那样精确,那么您应该尝试这样-
var offset = new Date().getTimezoneOffset();
if(offset<0)
{
var extraZero = "";
if(-offset%60<10)
extraZero="0";
console.log( "Your timezone is- GMT+" + Math.ceil(offset/-60)+":"+extraZero+(-offset%60));
}
else
{
var extraZero = "";
if(offset%60<10)
extraZero="0";
console.log( "Your timezone is- GMT-" + Math.floor(offset/60)+":"+extraZero+(offset%60));
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
501946 次 |
最近记录: |