将本地时间转换为用户首选时区,将用户首选时区转换为 GMT

Posted

技术标签:

【中文标题】将本地时间转换为用户首选时区,将用户首选时区转换为 GMT【英文标题】:Convert local time to user preferred timezone and user preferred timezone to GMT 【发布时间】:2021-12-12 14:45:44 【问题描述】:

在我的应用程序中,我使用时区选择作为用户偏好。在显示日期时,我将本地时间转换为用户首选时区。要转换我使用下面的方法

function convertSystemTimeToUserTimeZone(localDateTimeValue)
      var userTimeZoneOffset = 3; //For example purpose
      var newDate = new Date(localDateTimeValue.getTime() + (localDateTimeValue.getTimezoneOffset() * 60000) + (userTimeZoneOffset * 3600000));
      return newDate;

例如。我正在将本地时区(即 IST)转换为用户首选时区,即 EST

这工作正常并将用户本地系统时间转换为他的用户首选时区。 (注意:只有日期时间值发生变化,但时区仍显示本地系统时区)

现在在将此日期发送到后端时,我需要将其转换为 GMT。我不知道如何将此返回的日期转换为 GMT,因为当我计算 GMT 转换时,它考虑的是本地系统时区 (IST) 而不是用户首选时区设置 (EST)。

我尝试了以下方法,但没有运气。

console.log(new Date(userTimeZoneDateTimeValue.getUTCFullYear(), userTimeZoneDateTimeValue.getUTCMonth(), userTimeZoneDateTimeValue.getUTCDate(), userTimeZoneDateTimeValue.getUTCHours(), userTimeZoneDateTimeValue.getUTCMinutes(), userTimeZoneDateTimeValue.getUTCSeconds()));
console.log(userTimeZoneDateTimeValue.toUTCString());

【问题讨论】:

ECMAScript Date 对象本质上都是 UTC,时区和偏移量只对显示很重要。 date.toLocaleString('default', timeZone:'America/New_York', timeZoneName:'long') 应该可以完成这项工作。 【参考方案1】:

function getTimeZone( _add = 0 ) 
  var offset = new Date().getTimezoneOffset(), o = Math.abs(offset) + _add;
  return (offset < 0 ? "+" : "-") + ("00" + Math.floor(o / 60)).slice(-2) + ":" + ("00" + (o % 60)).slice(-2);



var addOffset = 180; // 3 hours
console.log("With offset: ", getTimeZone(addOffset) );

console.log("Without offset: ", getTimeZone() );

【讨论】:

纯代码答案没有帮助。一个好的答案应该解释为什么 OP 有问题以及您的代码如何修复它。

以上是关于将本地时间转换为用户首选时区,将用户首选时区转换为 GMT的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Moment.js 日期转换为用户本地时区?

Flask + Jinja:将 UTC 转换为本地时区

使用 joda time 将一个时区转换为另一个时区

如何将用户的本地时间转换为多伦多时区,然后在 Javascript 中根据多伦多时间检查 dst?

将 UTC DateTime 转换为另一个时区

将 GMT 日期时间转换为本地时区日期时间