使用JavaScript从时区名称中获取时区偏移



我找到了许多解决方案,这些解决方案从偏移值中给出了时区名称。但是我有时区名称,我希望为此偏移价值。我尝试了SettimeZone('Asia/Kolkata'),但我认为它们不是SettimeZone的方法。

示例:

Asia/Kolkata should give me -330 ( offset )

这是使用现代JavaScript完成此任务的最简单方法。

注意:请记住,偏移取决于日光节省时间(DST)是否处于活动状态。

/* @return A timezone offset in minutes */
const getOffset = (timeZone = 'UTC', date = new Date()) => {
  const utcDate = new Date(date.toLocaleString('en-US', { timeZone: 'UTC' }));
  const tzDate = new Date(date.toLocaleString('en-US', { timeZone }));
  return (tzDate.getTime() - utcDate.getTime()) / 6e4;
}
console.log(`No arguments: ${getOffset()}`); // 0
{
  console.log('! Test Case #1 >> Now');
  console.log(`Asia/Colombo     : ${getOffset('Asia/Colombo')}`);     //  330
  console.log(`America/New_York : ${getOffset('America/New_York')}`); // -240
}
{
  console.log('! Test Case #2 >> DST : off');
  const date = new Date(2021, 0, 1);
  console.log(`Asia/Colombo     : ${getOffset('Asia/Colombo', date)}`);     //  330
  console.log(`America/New_York : ${getOffset('America/New_York', date)}`); // -300
}
{
  console.log('! Test Case #3 >> DST : on');
  const date = new Date(2021, 5, 1);
  console.log(`Asia/Colombo     : ${getOffset('Asia/Colombo', date)}`);     //  330
  console.log(`America/New_York : ${getOffset('America/New_York', date)}`); // -240
}
.as-console-wrapper { top: 0; max-height: 100% !important; }

我遇到了同样的问题,这是我提出的解决方案,如果您可以像您提到的那样获得IANA TZ数据库名称:

const myTimezoneName = "Asia/Colombo";
 
// Generating the formatted text
// Setting the timeZoneName to longOffset will convert PDT to GMT-07:00
const options = {timeZone: myTimezoneName, timeZoneName: "longOffset"};
const dateText = Intl.DateTimeFormat([], options).format(new Date);
 
// Scraping the numbers we want from the text
// The default value '+0' is needed when the timezone is missing the number part. Ex. Africa/Bamako --> GMT
let timezoneString = dateText.split(" ")[1].slice(3) || '+0';
// Getting the offset
let timezoneOffset = parseInt(timezoneString.split(':')[0])*60;
// Checking for a minutes offset and adding if appropriate
if (timezoneString.includes(":")) {
   timezoneOffset = timezoneOffset + parseInt(timezoneString.split(':')[1]);
}

这不是一个很好的解决方案,但是它可以在没有导入任何内容的情况下完成工作。它依赖于intl.dateTimeFormat的输出格式是一致的,它应该是一个潜在的警告。

您不能单独使用名称。您还需要知道特定时间。Asia/Kolkata可能已固定为单个偏移,但是在标准时间和日光节省时间之间进行了许多时区,因此您不能仅获得偏移,您只能获得偏移。

有关如何在JavaScript中进行操作,请参阅此答案。

使用国家和时区NPM软件包:

import {getTimezone} from 'countries-and-timezones';
const australianTimezone = 'Australia/Melbourne';
console.log(getTimezone(australianTimezone));

打印到控制台:

{
  name: 'Australia/Melbourne',
  country: 'AU',
  utcOffset: 600,
  utcOffsetStr: '+10:00',
  dstOffset: 660,
  dstOffsetStr: '+11:00',
  aliasOf: null
}

从那里,您可以根据日光储蓄时间使用UTCOFFSET或DSTOFFSET。

相关内容

  • 没有找到相关文章

最新更新