我正在获取日历实例
Calendar.getInstance()
在一部手机中,它将星期六显示为周末,而在另一部手机中,它将星期日显示为周末 两个设备的时区相同
如果我将日历实例区域设置设置为美国或任何其他国家/地区,它可以完美运行。 但我不希望它是恒定的。我希望它是区域性的,但在所有设备上都是一致的
如果时区相同,我希望两台设备上的周末相同
你可以尝试类似的东西。
Calendar sundayFirst = Calendar.getInstance();
sundayFirst.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
一周的第一天(因此也是最后一天)因区域设置而异(不按时区或 GMT 偏移量)。区域设置可以定义国家或地区和/或语言。语言不相关(至少通常不相关),但国家是。例如巴基斯坦:
WeekFields wf = WeekFields.of(Locale.forLanguageTag("ur-PK"));
System.out.println("Last day of week is " + wf.getFirstDayOfWeek().plus(6));
输出为:
一周的最后一天是星期六
或者阿拉伯联合酋长国,既然你提到了海湾(我假设是波斯湾):
WeekFields wf = WeekFields.of(Locale.forLanguageTag("ar-AE"));
一周的最后一天是星期五
要使用默认区域设置,请指定Locale.getDefault()
:
WeekFields wf = WeekFields.of(Locale.getDefault());
由于我的区域设置是丹麦(欧洲),我现在Last day of week is SUNDAY
。
我正在使用java.time的WeekFields
类,现代Java日期和时间API。您使用的Calendar
类设计不佳且早已过时,而现代 API 提供了更丰富的功能。
发生了什么事?
对您观察到的行为的可能解释包括:
- 您的两台设备具有不同的国家/地区设置。我认为这是可能的解释。您尚未告诉我们每台设备的国家/地区设置。
- 在至少一台设备上,JVM 不遵循设备语言环境设置。可以使用与底层系统不同的语言环境设置启动 JVM(并不是说我不知道如何在 Android 上做到这一点)。也可以通过
Locale.setDefault
方法之一动态更改 JVM 的语言环境设置。
设备 - 的不同 Android 版本之间的区域设置数据已更改,因此对于相关国家/地区,一台设备认为一天从星期日开始,在另一台设备上则从星期一开始。区域设置数据一直在更新。
为了更近一点,我将首先在每个设备上输出Locale.getDefault().getDisplayCountry()
。
问:我可以在 Android 上使用 java.time 吗?
是的,java.time在较旧和较新的Android设备上运行良好。它只需要至少Java6。
- 在 Java 8 及更高版本以及较新的 Android 设备(从 API 级别 26)中,内置了现代 API。
- 在Java 6和7中获取ThreeTen Backport,现代类的反向移植(JSR 310的ThreeTen;请参阅底部的链接)。
- 在(较旧的)Android上使用Android版本的ThreeTen Backport。它被称为ThreeTenABP。并确保从带有子包的
org.threeten.bp
导入日期和时间类。
链接
- Oracle 教程:日期时间解释如何使用 java.time。
- Java 规范请求 (JSR) 310,其中首次描述了
java.time
。 - ThreeTen Backport项目,将
java.time
向Java 6和7的反向移植(JSR-310的ThreeTen)。 - ThreeTenABP,ThreeTen Backport 的安卓版
- 问:如何在Android项目中使用ThreeTenABP,并进行了非常详尽的解释。
你可以试试这个
Calendar.getInstance().setFirstDayOfWeek(Calendar.SUNDAY);