我存储了一个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);
但是到期日现在正如预期一样。
答案 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);
}