繁体   English   中英

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

[英]How to guess user's timezone using date-fns?

我有一个要求,我需要在当地时区显示用户的时间。 这需要使用 date-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 moment.js ,我怎么能做到呢?

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

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

为了获取用户的 IANA 时区标识符,大多数现代浏览器现在支持以下内容:

Intl.DateTimeFormat().resolvedOptions().timeZone

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

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

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

此外,许多缩写词可能含糊不清(例如ISTI可能表示印度、以色列或爱尔兰,以及其他许多……)。 因此,在大多数情况下,如果您不需要缩写,通常最好不要使用它。

刚刚自己解决了类似的问题。 诀窍是使用format从功能date-fns-tz而不是从一个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

暂无
暂无

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

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