【问题标题】:JS: How to compare 2 dates converting from UTC to defined timezone?JS:如何比较从 UTC 转换为定义时区的 2 个日期?
【发布时间】:2017-07-04 21:40:00
【问题描述】:

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

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

还有一个以小时为单位的 TIMEZONE (based on this),而不是区域名称(如 America/Antigua)

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

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


我用 Moment.js 做什么

我使用 moment 来更改时区,但是当 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);

但到期日期现在按预期工作。

【问题讨论】:

  • “实际日期”是指“当前日期”?
  • 如果您将所有内容都简化为 UTC,那么您可以忘记时区。如果时间 A 在特定时区中的时间 B 之前,则 A 在任何时区中始终在 B 之前。如果您更改时间戳的时区偏移量,它将代表不同的时间点。
  • @Bergi 是的,先生,当前日期。对不起,我的英语不太好。
  • @RobG ,BD 保留 UTC 值,但如果您需要来自智利或西班牙的信息怎么办。信息是等价的,但时间不同。这是一个促销,如果是关于国际促销,你不能限制为 UTC,因为在不同的国家不是平等的情况。 (忽略代理和类似的东西)
  • @elporfirio—“2017-07-04T00:00:00.000Z”代表一个特定的时刻。如果将偏移量移至 -0600,则等效时间戳为“2017-07-03T18:00:00.000-0600”。一个常见的策略是将所有内容保持为 UTC 并转换为仅用于显示的任何时区。因此,如果用户输入“2017-07-03T18:00:00.000-0600”(或等效项),则将其存储为“2017-07-04T00:00:00.000Z”。时区 +1000 的用户会将其视为“2017-07-04T10:00:00.000+1000”。它们都是完全相同的时刻。

标签: javascript date momentjs


【解决方案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);

【讨论】:

    【解决方案2】:

    原始解决方案是:“添加小时差”

    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);
    }
    

    【讨论】:

      猜你喜欢
      • 2021-07-03
      • 2021-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-17
      • 2012-08-06
      • 1970-01-01
      • 2019-08-31
      相关资源
      最近更新 更多