【问题标题】:How to globally fix the timezone in android app?如何全局修复android应用程序中的时区?
【发布时间】:2021-07-29 06:27:07
【问题描述】:

我正在寻找最简单、最简洁的方法来修复 Android 应用中所有日期的时区。这个想法是让应用程序像用户在另一个时区一样运行。让我澄清一下我在寻找什么:

假设用户的手机设置为 America/New_York,那么我希望我的应用程序显示欧洲/阿姆斯特丹时区的所有日期(以 UTC 为单位),而不管手机本身设置的时区如何。如果我与 new Date() 进行比较,如果 new Date() 也处于欧洲/阿姆斯特丹时区的当前时间,那就太好了。

在互联网上搜索解决方案后,我开始觉得我必须更新我的应用程序中使用 Date 的每个地方并强制使用目标时区,就像这个 stackoverflow 帖子的解决方案:@ 987654321@

有人知道如何以更简单、更清洁的方式完成这项工作吗?

【问题讨论】:

  • 使用 Java 8 中引入的现代时间类。(LocalDateTime、ZonedDateTime 等)
  • 如果new Date() 是指java.util.Date - 该对象纯粹是UTC。它根本没有时区。此外,您应该通过ThreeTenABP 或更新的desugaring support 使用java.time.* API。
  • 如果我与 new Date() 进行比较,如果 new Date() 也处于欧洲/阿姆斯特丹时区的当前时间,那就太好了。 老式的Date 永远不会在任何特定的时区,所以这是不可能的。
  • 这或许能回答你的问题吗? How to set a JVM TimeZone Properly。我知道这不是专门针对 Android 的。

标签: java android kotlin timezone


【解决方案1】:

任何使用 java.time 的人的答案,现代 Java 日期和时间 API。

java.time 不包括用于设置 JVM 默认时区的选项。明智地如此。这不是你应该想做的事情。通过这样做,您会影响在同一 JVM 中运行的每个程序,并且您的程序的每个部分和 JVM 中的其他程序可能会以不同的方式设置它,从而破坏您的意图。

避免需要

在您的时间操作中明确说明您想要哪个时区,并且您将始终知道您会得到什么,而不受 JVM 设置的影响。示例:

    System.out.println(ZonedDateTime.now(ZoneId.of("Asia/Dushanbe")));

示例输出:

2021-05-09T00:36:25.171213+05:00[亚洲/杜尚别]

System.setProperty

​​>

如果你已经写了很多依赖JVM默​​认时区的代码,那么设置它的hack是:

    System.setProperty("user.timezone", "Australia/Tasmania");
    System.out.println(ZonedDateTime.now());

这是刚刚打印出来的:

2021-05-09T05:38:03.568350+10:00[澳大利亚/塔斯马尼亚]

不过,由于开头提到的原因,它不是很健壮。

如果您想验证您传递的字符串,请使用:

    System.setProperty("user.timezone", ZoneId.of("Australia/Tasmania").getId());

免责声明

从您的问题看来,您已经在使用旧的、设计不佳且早已过时的java.util.Date 班级和朋友。我仍然想为可以选择现代化的用户发布答案。 (您也可以使用与过时的 API 一起提供的两种想法。)

【讨论】:

    【解决方案2】:

    我会尝试TimeZone.setDefault(TimeZone),例如:

    TimeZone.setDefault(TimeZone.getTimeZone("Europe/Amsterdam"));

    (建议检查返回的时区,getTimeZone 不会为未知时区抛出异常 - 或使用 ZoneId 而不是 String

    TimeZone (这也提到了user.timezone系统属性)

    但我不是安卓程序员/用户

    【讨论】:

      猜你喜欢
      • 2019-11-01
      • 2011-11-28
      • 2011-07-10
      • 1970-01-01
      • 1970-01-01
      • 2021-03-26
      • 1970-01-01
      • 2019-06-28
      • 1970-01-01
      相关资源
      最近更新 更多