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

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

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

【问题讨论】:

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

标签: react-native


【解决方案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

【讨论】:

【解决方案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”库时遇到了问题,但我找到了两个可以完成这项工作的库:

  1. 如果您使用“bare”反应原生:
console.log(RNLocalize.getTimeZone());
// -> "Europe/Paris" 

  1. 如果您使用的是 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 这样的库,原因与我上面提到的相同。

    【讨论】:

    【解决方案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]
    猜你喜欢
    • 1970-01-01
    • 2018-06-09
    • 2017-11-23
    • 2021-03-23
    • 2023-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多