使用 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:
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 捕获获取元数据?