JS:如何比较从UTC转换到定义的时区的2个日期?

时间:2017-07-04 21:40:01

标签: javascript date momentjs

我存储了一个UTC日期字符串(没有时间):

var limitDateStr = "2017-07-04T00:00:00.000Z";

还有一个TIMEZONE小时(based on this),而不是Zone Name(如America / Antigua)

var timezone = "-6.0"; //could be from -12.0 to 12.0 

问题是:验证实际日期是否大于同一时区中的limitDate。

我用Moment.js做什么

我用时间来改变时区,但是当y改变偏移时。日期也改变了:

  var _expirationDateUTC = moment.utc(limitDateStr).utcOffset(parseFloat(timezone)).format();
  // "2017-07-03T18:00:00-06:00"

而不是2017-07-04T00:00:00-06:00

实际日期,效果很好:(天数节省除外)

var today = moment.utc().utcOffset(parseFloat(timezone)).format();
//"2017-07-04T15:32:49-06:00"

我想比较......也许是时刻功能:

today.isAfter(_expirationDateUTC);

但是到期日现在正如预期一样。

2 个答案:

答案 0 :(得分:1)

好的,问题似乎是这样:

var _expirationDateUTC = moment.utc(limitDateStr).utcOffset(parseFloat(timezone)).format();

其中limitDateStr = "2017-07-04T00:00:00.000Z";

到目前为止,你正在做的是用这个日期喂食时刻,然后应用时区偏移量,这将把时区(在这种情况下为-6)减去你实际喂食的日期。

“2017-07-04T00:00:00.000Z” - 6小时=“2017-07-03T18:00:00-06:00”

您要查找的不是在不同的时区计算limitDate,而是将limitDate设置为与utc相同但在不同的时区。

所以你需要这个代码块来增加目标区域的小时数:

var limitDateStr = moment("2017-07-04T00:00:00.000Z");
var timezone = "-6.0"

//Substract the timezone offset to the time;
//This should be: "2017-07-04T06:00:00.000Z"
limitDateStr.subtract({hours: parseFloat(timezone)});

//Now you can apply the offseting
//and this will become: "2017-07-04T00:00:00-06:00"
var _expirationDateUTC = moment.utc(limitDateStr).utcOffset(parseFloat(timezone)).format();

var today = moment.utc().utcOffset(parseFloat(timezone)).format();

var hasExpired = today.isAfter(_expirationDateUTC);

答案 1 :(得分:0)

原始解决方案是:"在小时内添加差异"

function validateDateBefore(date, timezone){
  /** enable this for end day limit **/
  //var _expirationDateUTC = moment.utc(date).utcOffset(parseFloat(timezone)).startOf('hour').add((parseFloat(timezone) * -1) + 23, 'hours').add(59, 'minute').add(59, 'second').format();
  var _expirationDateUTC = moment.utc(date).utcOffset(parseFloat(timezone)).startOf('hour').add((parseFloat(timezone) * -1), 'hours').format();
  var _todayUTC = moment.utc().utcOffset(parseFloat(timezone)).format();

  var today = moment(_todayUTC);
  var expiration = moment(_expirationDateUTC);

  return expiration.isAfter(today);
}