Java 如何在android应用程序中全局固定时区?
我正在寻找一种最简单、最干净的方法来修复Android应用程序中所有日期的时区。这样做的目的是让应用程序像用户在另一个时区一样运行。让我澄清一下我在寻找什么: 假设用户的手机设置为America/New_York,那么我希望我的应用程序显示欧洲/阿姆斯特丹时区中的所有日期(以UTC为单位),而不管手机本身设置的时区。如果我与一个新日期()进行比较,如果这个新日期()也在欧洲/阿姆斯特丹时区的当前时间,那就太好了 在互联网上搜索解决方案后,我开始觉得我必须更新我应用程序中使用日期的每个地方,并强制使用目标时区,就像这篇文章的解决方案:Java 如何在android应用程序中全局固定时区?,java,android,kotlin,timezone,Java,Android,Kotlin,Timezone,我正在寻找一种最简单、最干净的方法来修复Android应用程序中所有日期的时区。这样做的目的是让应用程序像用户在另一个时区一样运行。让我澄清一下我在寻找什么: 假设用户的手机设置为America/New_York,那么我希望我的应用程序显示欧洲/阿姆斯特丹时区中的所有日期(以UTC为单位),而不管手机本身设置的时区。如果我与一个新日期()进行比较,如果这个新日期()也在欧洲/阿姆斯特丹时区的当前时间,那就太好了 在互联网上搜索解决方案后,我开始觉得我必须更新我应用程序中使用日期的每个地方,并强制
有人知道如何以更简单、更干净的方式完成此任务吗?我会尝试
TimeZone.setDefault(TimeZone)
如:
TimeZone.setDefault(TimeZone.getTimeZone(“欧洲/阿姆斯特丹”)代码>
(建议检查返回的时区,getTimeZone
不会对未知时区引发异常-或者使用ZoneId
而不是字符串
)
请参阅(这也提到了user.timezone
system属性)
但是我不是一个android程序员/用户对于任何使用java.time(现代java日期和时间API)的人来说,我都不是答案
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默认时区的代码,那么设置它的技巧是:
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提供的两种思想中的每一种。)使用Java 8中引入的现代时间类。(LocalDateTime、ZonedDateTime等)如果通过new Date()
您的意思是java.util.Date
,则该对象纯粹是UTC。它根本没有时区。此外,您应该使用java.time.*
API,无论是通过还是更新的。如果我与新日期()进行比较,如果新日期()也在欧洲/阿姆斯特丹时区的当前时间,那就太好了。一个老式的日期永远不在任何特定的时区,所以这是不可能的。这也许能回答你的问题吗。我知道这不是关于安卓的。