我想计算第二天在洛杉矶的当前本地时间。目的是将cookie设置到la的下一个午夜。
我已经使用了时区和时区,但是,我无法将开销证明为单个函数的构建大小。
这是我正在使用的,但是我一直坚持将时间从LA午夜转换回当地时间,就像我将其转换回当前时间之前一样。我认为倒退时convertToOtherTimezone
函数不会有问题,但我不太确定还有什么要探索的。
非常感谢您的帮助。
const convertToOtherTimezone = (date, from, to) => {
const utc = date.getTime() + (3600000 * from)
return new Date(utc + (3600000 * to))
}
console.log(
'native local time in LA',
new Date().toLocaleString('en-US', { timeZone: 'America/Los_Angeles' })
)
const LA_OFFSET = -7
// I'm using the AEST timezone -10
const LOCAL_OFFSET = new Date().getTimezoneOffset() / 60
const midnightInLA = (localOffset) => {
// get the current time in LA
const la = convertToOtherTimezone(new Date(), localOffset, LA_OFFSET)
console.log('current time in LA', la)
// set date to midnight in LA's timezone
la.setHours(24,0,0,0)
console.log('next midnight in LA', la)
// convert back to local time
return convertToOtherTimezone(la, LA_OFFSET, localOffset)
// Ulias Hunka gave the correct answer, but deleted his post.
// reverse the offsets
return convertToOtherTimezone(la, LA_OFFSET * -1, localOffset * -1)
}
console.log(
'la midnight in local time',
midnightInLA(LOCAL_OFFSET)
)
<script src="https://codepen.io/synthet1c/pen/KyQQmL.js"></script>
答案 0 :(得分:0)
我相信您问题中的代码段非常接近,但您似乎在向错误的方向添加了偏移量。
您可能会遇到夏令时的问题-例如,在夏季,洛杉矶的夏令时为UTC-7h,但通常为UTC-8h。如果您不想使用moment.js,那么我能想到的唯一选择就是解析时间格式的字符串。
这不是最可靠的方法,仅适用于document.getElementById("myLink").href = document.URL;
格式化时间。根据浏览器的不同,en-US
时区也可能不可用。
America/Los_Angeles
答案 1 :(得分:0)
洛杉矶的标准时间是UTC-0800。当偏移量更改为UTC-0700时,它将在三月的第二个星期日凌晨2点更改为夏令时(DST)。它于11月的第一个星期日凌晨2点(DST)结束。
这些规则可能会在将来持续一段时间,如果您仅对当前日期感兴趣,则可以使用这些规则直到它们更改。您可以计算给定日期和时间的偏移量,然后为洛杉矶的下一个午夜创建日期。我希望您已将该信息放在问题中而不是在评论中。见下文。
/**
* Calculate the offset in LA for the given date and time.
* LA DST starts on the second Sunday in March at
* 10:00 UTC. After that, the offset is UTC-0700
* LA DST ends on the first Sunday in November at 09:00
* UTC. After that the offset is UTC-0800
*
* @param {Date} date - date object
* @returns (boolean} true if DST is being observed
*/
function getLAOffset(date) {
// Get DST start in UTC
var start = new Date(Date.UTC(date.getUTCFullYear(), 2, 1, 10));
start.setUTCDate(start.getUTCDate() + (7-start.getUTCDay())%7 + 7);
// Get DST end in UTC
var end = new Date(Date.UTC(date.getUTCFullYear(), 10, 1, 9));
end.setUTCDate(end.getUTCDate() + (7-end.getUTCDay())%7);
return (date >= start && date < end)? -7 : -8;
}
/** Return a Date object set to midnight in LA
* for the next midnight after the given date.
* Offset comes from getLAOffset
*
* @param {Date} date to use for local date values
* @returns {Date} set to midnight in LA
*/
function getLAMidnight(date) {
var d = new Date(+date);
// Get offset. If hour is before offset, set to offset
// If hour is after offset, set to offset tomorrow
// Re-check offset and adjust if necessary
var offset = getLAOffset(d);
var midLA = d.setUTCHours(-offset, 0, 0, 0);
if (d < date) d.setUTCDate(d.getUTCDate() + 1);
d.setUTCHours(-getLAOffset(d));
return d;
}
// Local date and time for midnight LA tomorrow:
[new Date(2018,0, 1), // 1 Jan 2018
new Date(2018,2,11), // 11 Mar 2018
new Date(2018,2,11, 12), // 11 Mar 2018, noon
new Date(2018,2,12), // 12 Mar 2018
new Date(2018,5, 1), // 1 Jun 2018
new Date(2018,10,4), // 4 Nov 2018
new Date(2018,11,1), // 1 Dec 2018
new Date() // Current
].forEach(function(date) {
console.log('Local date : ' + date.toString() +
'\nNext LA midnight : ' + getLAMidnight(date).toString());
});