js,获取其他时区的午夜当地时间

时间:2018-07-10 10:49:59

标签: javascript date time timezone

我想计算第二天在洛杉矶的当前本地时间。目的是将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>

2 个答案:

答案 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());
});