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
完全相同,我的回答是基于这样的假设。
我正在创建一个解决方法来修复我的应用程序中 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
).
我正在演示边缘情况并为此使用 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
完全相同,我的回答是基于这样的假设。