在javascript中获取历史日期的时区

时间:2017-10-25 09:01:10

标签: javascript date datetime timezone momentjs

项目的业务要求如下:

用户需要根据当地时区查看历史日期。目前,我们在数据库中存储了两个日期:UTC和当地时间。用户需要在(历史)时区查看日期。

示例:

  

数据库值:2017-10-25T12:00:00(UTC),2017-10-25T09:00:00(日期)   注册)。

从这些值中,我们希望用户在他的时区中查看日期。

  

2017-10-25T12:00:00(UTC)至CEST(时区偏移+0200)=>   2017-10-25T14:00:00

但是,当用户在夏令时不适用的日期查看相同日期时,用户将看到2017-10-25T13:00:00,因为CET为+0100。

我正在寻找一种方法,可以在UTC日期为用户的区域设置获取UTC的偏移量。

简而言之:在用户的本地时区获取历史日期的UTC偏移量。

编辑:接受像Moment.js和Moment_timezone.js这样的库!

2 个答案:

答案 0 :(得分:1)

  

我正在寻找一种方法,可以在UTC日期为用户的区域设置获取UTC的偏移量。

var dt = new Date("2017-10-25T12:00:00Z");
var offset = dt.getTimezoneOffset();

(注意最后的Z

虽然真的,但人们想知道为什么你需要补偿。本地时间已由Date中的dt对象表示。

如果您想使用Moment执行此操作,则可以执行以下操作:

var m = moment("2017-10-25T12:00:00Z");

或者,如果您不想添加Z,请按以下方式创建Moment对象:

var m = moment.utc("2017-10-25T12:00:00").local();

您可以从那里格式化片刻,或者如果您愿意,可以拨打m.utcOffset()

除非您打算反映用户当地时区以外的某个时区,否则您不需要Moment-timezone。

答案 1 :(得分:0)

谢谢大家的意见。我想是通过这样做得到的:

var oUTC = moment(new Date(2015, 7, 25, 12, 0, 0, 0));
var oRecordedDate = moment(new Date(2015, 7, 25, 13, 0, 0, 0));

//step 1: calculate historic offset with DB values
var iDBOffset = oUTC.diff(oRecordedDate);

//step 2: calculate historic offset from UTC in user's locale
var oHistoricDate = oUTC.clone().tz(moment.tz.guess());
var iHistoricOffset = Math.abs(oHistoricDate.utcOffset() * 60 * 1000);

//step 3: calculate total offset
var iTotalOffset = iDBOffset - iHistoricOffset;

//step 4: resulting date object
var oDate = new Date(oRecordedDate.valueOf() - iTotalOffset);
console.log(oDate.toString());