使用 React Native 获取时区

Posted

技术标签:

【中文标题】使用 React Native 获取时区【英文标题】:Get the time zone with React Native 【发布时间】:2016-09-29 21:29:30 【问题描述】:

我想获取电话用户的时区,以便将其添加或减去我从 API 获得的 UTC 时间,然后对其进行操作(例如通知)。

我只找到了如何使用 DatePickerios 添加偏移量,但没有其他... 可以从前面获取吗?

【问题讨论】:

您想以某种方式获取设备时区吗?你能不能只从 Date 对象上的getTimezoneOffset() 获取它(在 JS 中)? 它可能真的有效...让我看看! 太棒了!让我知道,我会正式发布答案。 成功了! 'var d = 新日期(); var n = d.getTimezoneOffset() / 60;' n 给出了我必须减去的小时数。谢谢!回答,我会赞成你的回答:) 【参考方案1】:

我发现最好先获取实际的时区 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

【讨论】:

自 3.0.0 版起无法使用。改为检查:github.com/react-native-community/… 此方法在最新版本的 react-native-device-info 中已弃用。并且不再存在于文档中。相关公关:github.com/react-native-community/react-native-localize/pull/65 这已被 react-native-device-info 弃用。所以它不再起作用了!使用 react-native-localize 获取时区【参考方案2】:

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

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

【讨论】:

这不能正常工作。我在 UTC-3,这个脚本只返回 3。我猜不出是 UTC+3 还是 UTC-3。 @Cosmitar 它应该返回分钟,而不是小时......如果你在浏览器控制台中运行它会返回什么? 如果返回分钟,为什么 var 叫offsetInHours?。浏览器控制台中的结果是 3。 您会注意到该方法返回分钟,但我的 sn-p 除以 60 得到小时。此外,OP 希望增加或减少小时数,不一定是负数。我会推荐一些你需要的东西。 这个函数不准确,因为它不考虑夏令时【参考方案3】:

我还需要在我的 React Native 应用程序中获取时区。但我需要获得 IANA 格式的时区,而不是偏移量。

上面建议的库“react-native-device-info”,弃用了 timeZone 方法,因此我不得不搜索更新的替代方案。

我正在使用 expo,但我在使用“react-intl”库时遇到了问题,但我找到了两个可以完成这项工作的库:

    如果您使用“bare”反应原生:

“react-native-localize”库是一个不错的选择。

https://github.com/zoontek/react-native-localize

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

    如果您使用的是 expo
“expo-localization”是最好的选择。 https://docs.expo.io/versions/latest/sdk/localization/
 console.log(Localization.timezone);
// -> "Europe/Paris" 

【讨论】:

【参考方案4】:

如果您使用 Expo 构建项目,则可以使用 Localization 对象。

进口:

import  Localization  from 'expo';

用途:

console.log(Localization.timezone)

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

【讨论】:

不建议使用仅链接的答案。相反,请解释您问题的链接,并保留该链接。 目前是import * as Localization from 'expo-localization';【参考方案5】:

我建议不要使用偏移量,因为它不适合夏令时或操作系统可以进行的任何其他调整。

而是让 JavaScript 为您从 UTC 进行转换。这个 SO 答案显示了一个示例:Convert UTC date time to local date time using JavaScript

如果您需要转换为 任意 时区,您应该考虑使用像 moment.js 这样的库,原因与我上面提到的相同。

【讨论】:

moment.js 是considered legacy android 不支持此功能,因为不支持Intl【参考方案6】:

为了在 React Native(或网络上)中获取时区,我使用这个:

Intl.DateTimeFormat().resolvedOptions().timeZone

返回类似:“America/Los_Angeles”

【讨论】:

是否有适用于 Android 的等价物? Intl 也只适用于我的 iOS。 要在 Android 上启用,您需要取消注释您的 app/build.gradle 文件的一部分。我的在第 109 行。特别是 def jscFlavor = 'org.webkit:android-jsc-intl:+' [未处理的承诺拒绝:ReferenceError:找不到变量:Intl]

以上是关于使用 React Native 获取时区的主要内容,如果未能解决你的问题,请参考以下文章

使用 react-native-pdf 在 react-native 上获取准确的 x 和 y 坐标

React-Native 获取设备当前网络状态 NetInfo

如何使用 React-Native-Camera 捕获获取元数据?

使用 react-native-ble-manager 获取可用蓝牙设备的列表

react native怎么获取标签

如何使用 react-native 从非 GPS GNSS(如 GLONASS)获取坐标