如何将JavaScript日期与特定时区中的日期进行比较?

时间:2018-02-10 01:08:36

标签: javascript date timezone

我想知道当前时间是否大于本周一下午5:00山区时间,无论此代码运行的时区是什么。我有这样的事情:

function isAfterMondayEvening() {
  var now = new Date();
  var mondayEvening = dateFns.setHours(dateFns.setDay(now, 1), 17);
  return dateFns.compareAsc(now, mondayEvening);
}

console.log(isAfterMondayEvening());
<script src="//cdn.rawgit.com/date-fns/date-fns/a0005af7d1c3f70c88b8e619bfdff4bf85122863/dist/date_fns.js"></script>

如果运行的服务器或浏览器位于不同的时区,那么它将比较时区中星期一5点的时间。我想比较星期一下午5点在山区时间,无论这个代码在什么时区运行。我怎么能这样做?

6 个答案:

答案 0 :(得分:1)

我使用的方法是将两个日期标准化为GMT。假设您的服务器日期已经是GMT,您可以通过减去时区偏移量将浏览器时间转换为GMT。

例如,我在大西洋标准时间(GMT + 4)。为了获得当前时间,就像我在GMT中一样,我使用公式:

2018-02-09T15:00:00+0400 - (4 * 60 * 60 * 1000) = 2018-02-09T15:00:00Z`

...其中4是以小时为单位的偏移量。

特别是在JS:

const browserOffset = new Date().getTimezoneOffset();
const timeFromServer = getTimeFromServer();
const currentTimeAsGmt = new Date(Date.now() - (browserOffset * 60 * 1000));

// Now compare timeFromServer (already in GMT) to currentTimeAsGmt

在JS中,Date#getTimezoneOffset返回分钟中的偏移量,因此我省略了额外的* 60

答案 1 :(得分:1)

如果你对IE 10+很酷,请使用luxon(https://moment.github.io/luxon/index.html

function isAfterMondayEvening() {
  const currentTime = luxon.DateTime.local().setZone('America/Denver');
  const mondayEvening = currentTime.set({weekday: 1, hour: 17}).startOf('hour');
  return currentTime > mondayEvening;
}

答案 2 :(得分:0)

请原谅我的PHP。但是在我们的应用程序中,我们花时间使用时区并将其转换为服务器/开发人员时区的本地内容作为实用程序功能。一旦你有了,你可以正常解析它。到目前为止,它已经成功了,在洛杉矶,纽约和芝加哥都有服务器/开发人员。

以下是一个例子:

public static function localTime($time, $tz = 'America/New_York', $format = 'Y-m-d h:i:s') {

                $date = new \DateTime($time, new \DateTimeZone($tz));
                $date->setTimezone(new \DateTimeZone(date_default_timezone_get()));
                return $date->format($format);

}

答案 3 :(得分:0)

当你说&#34;山区时间&#34;时,你是在谈论山地标准时间还是想要考虑山区日光时间?如果您一直在谈论Mountain Standard Time,那么您可以忽略我的答案,因为您的案例更简单。我将解决你想要考虑Mountain Daylight Time的可能性,这是一个更复杂的问题。

如果您考虑到白天时间,请记住,并非山区时区内的每个地方都会观察到山区夏令时,所以您实际上需要知道山区时区内的位置(例如,是吗?亚利桑那州还是犹他州?)一旦你知道,你需要一个像Moment Timezone这样的库,它有足够的时区信息。然后你必须找到最准确的tz database timezone name并在Moment Timezone的帮助下使用它来计算本周一下午5:00在这个特定位置的山区时间的实际UTC时间& #34 ;.您的代码看起来像这样:

// Use whatever time and timezone you're trying to compare with.
const targetDate = moment()
  .tz('America/Denver')
  .day(1) // Monday
  .hour(17) // 5pm
  .minute(0)
  .second(0)
  .millisecond(0)
  .toDate();

if (new Date() > targetDate) {
  console.log('after target time');
} else {
  console.log('before target time');
}

答案 4 :(得分:0)

假设您可以计算出本周的周一年/月/日索引,我认为您可以在没有库的情况下执行此操作。诀窍是用UTC表示你已知的山区时间:

let utcMonday = new Date(Date.UTC(2018, 2 - 1, 5, 24));
let cstDate = new Date();
let currentTimeGreater = cstDate > utcMonday;

// The rest isn't needed, but shows some console logs of what is going on

let locale = "en-US";
let timeFormatOptions = {
  weekday: "short",
  hour: "numeric",
  minute: "numeric",
  timeZoneName: "long",
  timeZone: "America/Denver"
};

let formattedMountainMonday = utcMonday.toLocaleDateString(
  locale,
  timeFormatOptions
);

let formattedCurrentTime = cstDate.toLocaleDateString(
  locale,
  timeFormatOptions
);

console.log(formattedMountainMonday);
console.log(
  `Current time in relation to Mountain time: ${formattedCurrentTime}`
);
console.log(
  `Current time is greater than this week's Mountain Monday at 5:00 PM: ${currentTimeGreater}`
);

答案 5 :(得分:0)

美国山地时间(MT)偏移为-0700。 Javascript日期是UTC的核心,所以您需要做的就是将内部UTC时间值与MT进行比较。到“本周的星期一”,我认为你想在周日和周一到17:00真实。如果您只是星期一,请删除d.getUTCDay() == 0 ||部分。

function isBefore1700MT(date) {

  // Copy date so don't affect original
  var d = new Date(date);

  // Adjust internal UTC to MT
  d.setUTCHours(d.getUTCHours() - 7);

  // Return true if the UTC day is Sunday or Monday before 17:00
  return d.getUTCDay() == 0 || (d.getUTCDay() == 1 && d.getUTCHours() < 17);
}

// Test using current local date and time
var date = new Date();
console.log(date.toString() + ' : ' + isBefore1700MT(date));