CodenameOne - 修复 Calendar get(Calendar.DAY_OF_WEEK) 比预期更大的值

CodenameOne - fixing Calendar get(Calendar.DAY_OF_WEEK) bigger value than expected

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

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

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

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

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

创建此 post 时是星期三 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 值。

我知道 java.time,现代 Java 日期和时间 API,还不是 CodeName One 的一部分,因此您不能在您的案例中使用它。除了像你这样的特殊情况,没有人应该使用 Calendar 因为它设计不佳且早已过时。大家应该用java.time.

要从 Calendar 获取(1 = 星期一,...,7 = 星期日)(默认情况下您将从 java.time 获取的数字):

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

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

的 return 值中减去 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 完全相同,我的回答是基于这样的假设。