繁体   English   中英

使用 moment.js 时区在另一个时区获取极端日期(但答案为 UTC)

[英]Using moment.js timezone to get day extremes in another timezone (but the answer in UTC)

我想计算出某一天的极端情况(午夜到午夜),其中那一天是相对于现在的整数天数(即相对于Date.now() )......但与UTC不同的时区. 但我希望答案(午夜时间)回到 UTC 时间(以毫秒为单位,类似于您使用Date.now()得到的),这样我就可以将它们提供给期望 UTC 时间的 API 以获得准确的正确时间数据范围。 我曾尝试使用moment.js 时区,但被卡住了......我找到了这个答案,但它在不同的时区不起作用。

我建议您考虑使用Luxon ,它本质上是 moment.js 的替代品。

该算法是在所需的代表位置创建一个日期,减去所需的天数,然后设置为一天的开始,然后获取时间值,例如

 let DateTime = luxon.DateTime; // Create date for 00:00:00 3 days ago in Denver let d = DateTime.local() // Create a date.setZone('America/Denver') // Set to Denver.minus({days:3}) // Subtract 3 days.startOf('day'); // Set to start of day // Create date for end of day let e = d.endOf('day'); // Denver 3 days ago at start and end of day console.log('Start of day: ' + d.toISO() + '\nTime value: ' + d.ts); console.log('End of day: ' + e.toISO() + '\ntime value: ' + e.ts);
 <script src="https://cdn.jsdelivr.net/npm/luxon@1.24.1/build/global/luxon.min.js"></script>

请注意,由于偏移量差异,丹佛 3 天前的日期可能与主机系统中的 3 天前不同。 例如,在澳大利亚悉尼,7 月 20 日上午 9 点是丹佛 7 月 19 日下午 5 点,因此在悉尼减去 3 天是 7 月 17 日,但在丹佛是 7 月 16 日。

Moment 将允许您相当容易地做到这一点:

function getUTCMidnightMillis(timezone, days_ago) {
  return moment()               // Current time.
    .tz(timezone)               // Convert to desired timezone.
    .subtract(days_ago, 'days') // Go back x days.
    .startOf('day')             // Get start of day, aka Midnight!
    .utc()                      // Convert value into UTC.
    .valueOf()                  // Return milliseconds since unix epoch.
}

console.log("Midnight in Denver:", getUTCMidnightMillis("America/Denver", 0))
console.log("Midnight in New York:", getUTCMidnightMillis("America/New_York", 0))

产生output:

Midnight in Denver: 1594274400000
Midnight in New York: 1594267200000

事实上,您可以验证这是正确的:

new Date(1594274400000).toISOString()
// Produces: "2020-07-09T06:00:00.000Z"

2020 年 7 月 9 日,我们在丹佛观察到夏令时,使我们的 UTC 偏移量为 -6 小时。 因此,上述时间戳(UTC 上午 6:00)与丹佛午夜的时间相同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM