日历周末日问题



我正在获取日历实例

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);

相关内容

  • 没有找到相关文章

最新更新