如何在JavaScript中跨时区比较日期?

时间:2019-05-06 13:45:31

标签: javascript

我正在尝试将给定日期与当前日期进行比较,这对于印度时区工作正常,但其他时区可以放假一天。我经历过类似类型的问题,并且有一些建议,例如转换UTC字符串。转换UTC字符串后,在控制台时获得正确的日期,但在比较时未获得正确的结果。 这是我给定的日期,格式为“ YYYY-MM-DD”。 初始比较如下所示,在印度时区也可以正常工作。

              const datestring = '2019-05-06';
              const q = new Date();
              const m = q.getMonth();
              const d = q.getDate();
              const y = q.getFullYear();
              const currentDate = new Date(y, m, d);
              const givenDate = new Date(datestring);
              if (currentDate <= givenDate) {
                return null;
              } else {
                return {
                  'currentDateChecker': true
                };
              }
            }

上面的代码在印度时区和印度时区以外的其他时区都可以正常工作,因此可以节省一天的时间。

但是像这样转换为UTC后:

const givenDate = new Date(datestring).toUTCString();

现在,这将给出正确的日期,但是出于比较目的,我将当前日期也都转换为UTC字符串,到那时结果还没有达到预期。我知道有许多与此相关的文章,但没有找到正确的方法,因此只发布此问题。

2 个答案:

答案 0 :(得分:1)

困难之处在于new Date()将在您的时区中创建日期。对我来说,由于我是SAST(+2小时),所以如果我说new Date(2019, 4, 6),我将获得UTC日期时间5 May 22:00 2019。这使比较日期变得困难,因为印度的某个人想要比较“ 2019年5月6日”,实际上将获得UTC日期为2019年5月6日,而这将不等于2019年5月5日。

改为使用Date.UTC(year, month, day)-纪元时间是自2970年1月1日(UTC)以来的毫秒数。

const today = new Date()
const todayYear = today.getFullYear()
const todayMonth = today.getMonth()
const todayDay = today.getDate()
const todayUtc = Date.UTC(todayYear, todayMonth, todayDay)

const dateString = 'yyyy-mm-dd'
const dateArr = dateString.split('-')
const dateUtc = Date.UTC(dateArr[0], dateArr[1], dateArr[2])

if (todayUtc === dateUtc) {
  // ...
}

答案 1 :(得分:0)

您可以使用getTime进行比较:

// ...
const currentDate = new Date(y, m, d).getTime();
const givenDate = new Date(datestring).getTime();
if (currentDate <= givenDate) {
  return null;
} else {
  return {
    'currentDateChecker': true
  };
}