我想看看当前时间是否大于本周下午5:00 pm的山时间,无论该代码正在运行什么时区。我有类似的东西这个:
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点在山区时间进行比较,无论该代码的运行时间如何。我该怎么做?
我使用的一种方法是将两个日期归一化为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
。
如果您与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;
}
假设您可以找出本周的周一/月/天索引,我认为您可以在没有库的情况下执行此操作。诀窍是用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}`
);
美国山区时间(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));
当您说"山时间"时,您是在谈论山区标准时间还是想考虑山日光时间?如果您一直在谈论山区标准时间,则可以忽略我的答案,因为您的案件更简单。我将解决您也想考虑山日光时间的可能性,这是一个更复杂的问题。
如果您要考虑日光时间,请记住,并非山区时区域内的每个地方都会观察山日光时间,因此您实际上需要知道山区时区域内的位置(例如,是亚利桑那州还是亚利桑那州还是犹他州?(。一旦知道,您就需要一个具有足够时区信息的时刻区域的库。然后,您必须找到最准确的TZ数据库时区名称并在时刻区的帮助下使用它,以找出"本周星期一5:00 pm Mountain Time在此特定位置的实际UTC时间"。您的代码看起来像这样:
// 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');
}