使用React Native获取时区

nzkunb0c  于 2023-03-31  发布在  React
关注(0)|答案(9)|浏览(516)

我想获得电话用户的时区,这样我就可以将它添加到从API获得的UTC时间上或从中减去,然后对它们进行操作(例如,用于通知)。
我只找到了如何用DatePickerIOS添加偏移量,其他什么都没有...有没有可能从前面拿到?

gjmwrych

gjmwrych1#

我发现最好是获取实际的时区ID(例如America/New_York),然后在开始时将服务器程序设置为使用该时区。要获得该时区,请使用react-native-device-info库:https://www.npmjs.com/package/react-native-device-info

import DeviceInfo from 'react-native-device-info';

console.log(DeviceInfo.getTimezone());   //   'America/New_York'

如果您在编译期间遇到有关“tvOS”的错误,请参阅此修复:https://github.com/rebeccahughes/react-native-device-info/issues/286

kgsdhlau

kgsdhlau2#

你可以在浏览器上用JavaScript做的几乎所有事情(当然有例外),你都可以在React Native中做。我会启动一个新的日期对象,并在其上调用getTimezoneOffset()来获取时区在本地偏移的分钟数。

var date = new Date();
var offsetInHours = date.getTimezoneOffset() / 60;
zzoitvuj

zzoitvuj3#

我还需要在我的React Native应用程序中获取时区。但我需要以IANA格式获取时区,而不是偏移量。
上面建议的库**“react-native-device-info”**,不推荐使用timeZone方法,因此我不得不搜索更新的替代方案。
我正在使用expo,我在使用“react-intl”库时遇到了问题,但我发现有两个库可以完成这项工作:
1.如果您使用的是“bare”react native:

console.log(RNLocalize.getTimeZone());
// -> "Europe/Paris"

1.如果您使用 expo

console.log(Localization.timezone);
// -> "Europe/Paris"
ycggw6v2

ycggw6v24#

如果你使用Expo构建你的项目,你可以使用Localization对象。
进口:

import { Localization } from 'expo';

用途:

console.log(Localization.timezone)

它将以显示格式返回当前时区,例如America/Los_Angeles

ljo96ir5

ljo96ir55#

我建议不要使用偏移量,因为它不适合日光节约或操作系统可以进行的任何其他调整。
相反,让JavaScript为你从UTC转换。这个SO答案显示了一个例子:Convert UTC date time to local date time using JavaScript
如果你需要转换到一个 * 任意 * 时区,你应该考虑使用像moment.js这样的库,原因和我上面提到的一样。

vsnjm48y

vsnjm48y6#

为了在React Native中(或在Web上)获取时区,我使用以下命令:

Intl.DateTimeFormat().resolvedOptions().timeZone

它返回如下内容:“美洲/洛杉矶”

mpbci0fu

mpbci0fu7#

请尝试react-native-tz,当我找不到一个工作的替代品时构建了这个...它基于react-native-timezone,虽然是一个较新的实现。

btqmn9zl

btqmn9zl8#

DeviceInfo.getTimeZone()已移动到react-native-localize

nmpmafwu

nmpmafwu9#

最简单的解决方案是在一行中使用Date()。对于偏移量变量,您只需计算UTCHours和Hours of User-〉之间的差值,然后将此偏移量 * 60 * 60 * 1000添加到从Firebase获得的秒数中。这样您就可以获得正确的日期+时间

let offset = new Date().getHours() - new Date().getUTCHours()//this after seconds: + offset * 60 * 60 * 1000
            let year = new Date(item.creation.seconds * 1000).toISOString().slice(2, 4)
            let month = new Date(item.creation.seconds * 1000 + offset * 60 * 60 * 1000).toISOString().slice(5, 7)
            let day = new Date(item.creation.seconds * 1000 + offset * 60 * 60 * 1000).toISOString().slice(8, 10)
            let time = new Date(item.creation.seconds * 1000 + offset * 60 * 60 * 1000).toISOString().slice(11, 16)
            let endvalue = month + "." + day + "." + year + "  " + time
            setdate(endvalue)

相关问题