【问题标题】:How can i get timezone from timestamp?如何从时间戳获取时区?
【发布时间】:2021-03-25 11:08:49
【问题描述】:

当我尝试时

new Date().toISOString()

我有以下时间戳输出

2021-03-25T11:05:10.140Z

我在某处读到我们可以从 utc 或 unix 时间戳获取时区。

但他们没有解释我们如何做到这一点。这可能吗?

【问题讨论】:

  • 你不能。 Date 对象和“UTC 或 Unix 时间戳”不包含该信息。它仅包含自 01-01-1970, 00:00:00 UTC 以来的数(毫秒)秒。其中没有关于时区的信息。
  • getTimezoneOffset 返回一个偏移量,该偏移量是添加到本地时间以获取 UTC(格林威治以东 -ve 和 +ve 以西)的分钟数。该值基于主机系统的设置,它不是 Date 实例的属性。 toISOString 定义为返回 UTC。
  • @RobG 你能用 getTimezoneOffset 为你的例子写一个答案吗?提前致谢
  • 要将分钟转换为 HH:mm 请参阅How to convert minutes to time(hh:mm:ss)?
  • 您是否在寻找时区标识符(例如America/Los_Angeles)?还是时区偏移量(例如-08:00)?它们不是同一件事。请参阅the timezone tag wiki 中的“时区!= 偏移量”。

标签: javascript datetime timezone


【解决方案1】:

您可以使用 getTimezoneOffset 获取日期的主机时区偏移量,这是添加到本地日期和时间到 UTC 的分钟数(或者,从 UTC 中减去分钟数以获取本地时间)。

因此,符号是 +ve 表示西,而 -ve 表示东,这与常用的偏移量相反。可以使用反转符号并格式化值的简单函数将偏移量以分钟为单位转换为 +HH:mm。

自 1900 年以来,大多数偏移量甚至是 15 分钟的倍数,在此之前,偏移量是基于当地太阳正午,因此包括秒数。因此,任何将偏移量返回为 ±HH:mm 的函数都必须包含秒数(如果它们存在于偏移量中)。

由于偏移量以分钟为单位,因此秒(如果存在)以十进制分钟表示。由于 ECMAScript 数字不能准确表示 60 位,因此需要处理小数位。

例如1800 年 1 月 1 日在澳大利亚/悉尼是 +10:04:52,表示为 -604.8666666666667 分钟。这简单地转换为 +10:04:52.000000000000455,因此小数秒需要四舍五入到最接近的整数才能得到 +10:04:52。

/* Get host timezone offset for date
** @param {Date} date : date to get timezone offset for
** @returns {string|undefined} offset as "±HH:mm[:ss]" or
**          undefined if date is invalid
**          seconds only included if not zero
*/ 
function getOffset(date = new Date()) {
  let z = n => (n < 10? '0' : '') + n;
  let m = date.getTimezoneOffset();
  let sign = m < 0? '+' : '-';
  m = Math.abs(m);
  let HH = z(m / 60 | 0);
  let mm = z(m % 60 | 0);
  let ss = z(Math.round((m % 1) * 60));
  return isNaN(m)? void 0 : `${sign}${HH}:${mm}${ss=='00'?'':':'+ss}`;
}
 
[new Date(1800,0,1), // 1 Jan 1800, offset may have minutes
 new Date(2020,0,1), // 1 Jan 2020, may be DST in southern hemisphere
 new Date(2020,5,1), // 1 Jun 2020, may be DST in northern hemisphere
 new Date(NaN)       // invalid date
].forEach(d => console.log(d.toDateString() + ' ' + getOffset(d)));

【讨论】:

    【解决方案2】:
    console.log(Math.floor(new Date().getTime() / 1000));
    

    【讨论】:

    • xersuy 我不需要自 unix 时代以来的秒...
    • 完全没问题
    猜你喜欢
    • 2018-01-06
    • 2012-08-03
    • 1970-01-01
    • 2014-11-21
    • 1970-01-01
    • 2012-03-23
    • 2021-07-20
    • 1970-01-01
    • 2018-08-30
    相关资源
    最近更新 更多