如何使用日期-fns猜测用户的时区?



我有一个要求,需要显示用户在本地时区的时间。这需要使用日期fns来完成。

下面的代码检查当前时间,然后给定一个时区,根据时区将其转换为本地时间。

const { formatToTimeZone } = require('date-fns-timezone')
let date = new Date()
const format = 'D.M.YYYY HH:mm:ss [GMT]Z (z)'
const output = formatToTimeZone(date, format, { timeZone: 'Asia/Calcutta' })

然而,我如何快速猜测用户的时区?

moment.js中,您可以使用moment.tz.guess()获得它。但是,如果没有moment.js,使用date-fns,我该怎么做呢?

https://runkit.com/embed/835tsn9a87so

更新:我将在VueJS应用程序中使用它。因此,如果有任何其他相关的解决方案,我们也欢迎。谢谢

为了获得用户的IANA时区标识符,大多数现代浏览器现在都支持以下功能:

Intl.DateTimeFormat().resolvedOptions().timeZone

也就是说,您需要从date-fns-timezone使用formatToTimeZone的通常原因是,当您需要使用用户本地区域以外的其他时区时。否则,您通常可以使用date-fns中的format函数。

但是,在您的情况下,您还尝试使用z格式说明符来显示用户的时区缩写。这不是由日期fns直接提供的,所以如果这很关键,那么您确实需要使用上面显示的Intl api获取用户的时区,并使用formatToTimeZone

请记住,这些缩写是IANA数据记录的任何缩写,仅为英文,并且没有每个时区的缩写。对于那些没有的,您将看到一个数值,例如-02

此外,许多缩写可能是模糊的(例如IST中的I可能意味着印度、以色列或爱尔兰,以及许多其他国家…)。因此,在大多数情况下,如果你不需要缩写,你通常最好没有它。

我自己刚刚解决了一个类似的问题。诀窍是使用date-fns-tz中的format函数,而不是date-fns中的函数。

import { format } from "date-fns";
console.log(format(new Date(), "yyyy-MM-dd HH:mm z"));
// 2021-11-29 13:55 GMT-8
import { format } from "date-fns-tz";
console.log(format(new Date(), "yyyy-MM-dd HH:mm z"));
// 2021-11-29 13:55 PST

请参阅此处的文档:https://date-fns.org/v2.27.0/docs/Time-Zones

相关内容

  • 没有找到相关文章

最新更新