首页 > 解决方案 > CodenameOne - 修复日历 get(Calendar.DAY_OF_WEEK) 比预期更大的值

问题描述

我正在创建一种解决方法来修复我的应用程序中 CN1 的 SimpleDateFormat“克隆”类。

我不能使用纯 Java 中的其他类。

我在我的 CN1 应用程序中使用了这个指令

int dayNumber=c.get(Calendar.DAY_OF_WEEK);

用于处理格式字符串中的 u 字母。

在创建这篇文章时,星期三 dayNumber 的值恰好是 4。

所以我用

int dayNumber=c.get(Calendar.DAY_OF_WEEK)-1;

因为我在 Oracle 文档中找到

Day number of week (1 = Monday, ..., 7 = Sunday)

我想知道它是否正确,以便我涵盖一周中的 7 天,所以它就像

(1 = Monday, ..., 7 = Sunday)

我可以为 Java 和 Android 的兼容性设置正确的 u 值。

标签: javacalendarsimpledateformatdayofweek

解决方案


我了解现代 Java 日期和时间 API java.time 还不是 CodeName One 的一部分,因此您不能在您的情况下使用它。除了像您这样的特殊情况外,没有人应该使用Calendar它,因为它设计不佳且早已过时。每个人都应该使用 java.time。

要从(Calendar默认情况下从 java.time 获得的数字)获取 (1 = Monday, ..., 7 = Sunday):

    int dayNumber = (c.get(Calendar.DAY_OF_WEEK) + 5) % 7 + 1;

在模 7 下看到,我首先加 5,然后加 1,所以总共 6,这与减 1 相同。我正在使用这个技巧来确保我在 1 到 7 区间内得到一个数字(我们没有总是简单地从Calendar) 的返回值中减去 1。

我正在演示边缘案例并使用 java.time :

    LocalDate ld = LocalDate.of(2021, Month.SEPTEMBER, 5);
    ZonedDateTime startOfDay = ld.atStartOfDay(ZoneId.of("Etc/UTC"));
    Calendar c = GregorianCalendar.from(startOfDay);
    
    int dayNumber = (c.get(Calendar.DAY_OF_WEEK) + 5) % 7 + 1;
    
    System.out.format("%s: %s = %d%n", ld, ld.getDayOfWeek(), dayNumber);
    
    ld = ld.plusDays(1);
    startOfDay = ld.atStartOfDay(ZoneId.of("Etc/UTC"));
    c = GregorianCalendar.from(startOfDay);
    
    dayNumber = (c.get(Calendar.DAY_OF_WEEK) + 5) % 7 + 1;
    
    System.out.format("%s: %s = %d%n", ld, ld.getDayOfWeek(), dayNumber);

输出是:

2021-09-05: SUNDAY = 7
2021-09-06: MONDAY = 1

免责声明:我特别不知道 CodeName One Calendar。我强烈希望它的行为与原来的完全一样java.util.Calendar,我的回答是基于它的假设。


推荐阅读