我想知道当前时间是否大于本周一下午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点在山区时间,无论这个代码在什么时区运行。我怎么能这样做?
答案 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));