日历返回的数据不正确 API
Incorrect data returned by Calendar API
在我们的业务需求中,我们应该找出一周的第一天。
因为客户端是European
所以我用下面的代码来获取它。
但是,问题是当我 运行 这段代码时,我得到 2
作为我期望的答案 1
。
public class Test{
public static void main(String[] args) {
TimeZone eu = TimeZone.getTimeZone("Europe/Berlin");
Locale de = Locale.forLanguageTag("de");
int firstDayOfWeek = Calendar.getInstance(eu, de).getFirstDayOfWeek();
System.out.println(firstDayOfWeek);
}
}
谁能帮我理解这种行为。
看看 docs:
Gets what the first day of the week is; e.g., SUNDAY in the U.S., MONDAY in France.
和here:
public static final int MONDAY 2
这表明 return 值取决于语言环境。
如果我们打印这个:
System.out.println(firstDayOfWeek == Calendar.MONDAY);
我们会看到 true
。这意味着一周的第一天确实是星期一。只是你以为周一编码为1,其实周日编码为1。
根据 the javadoc,MONDAY 的值为 2。
Locale de = Locale.forLanguageTag("de");
WeekFields wf = WeekFields.of(de);
DayOfWeek firstDayOfWeek = wf.getFirstDayOfWeek();
System.out.println(firstDayOfWeek);
这会打印:
MONDAY
不要使用令人困惑的旧 Calendar
class。你得到 2 作为一周的第一天。但是你不是应该得到 1 吗?还是0?星期几是如何编号的?忘记数字,使用 java.time
中的 DayOfWeek
枚举,现代 Java 日期和时间 API。
要获得更漂亮的输出,请使用 DayOfWeek.getDisplayName
或 DateTimeFormatter
。如果确实需要数字,请使用 DayOfWeek.getValue
:
System.out.println(firstDayOfWeek.getDisplayName(TextStyle.FULL, de));
System.out.println(firstDayOfWeek.getValue());
输出为:
Montag
1
PS 也不要使用 TimeZone
和其他过时的日期和时间 classes。 java.time
更好用。这个例子很好地展示了这个事实,但它很典型,当然不是巧合。
Link: Oracle tutorial: Date Time 解释如何使用 java.time
.
在我们的业务需求中,我们应该找出一周的第一天。
因为客户端是European
所以我用下面的代码来获取它。
但是,问题是当我 运行 这段代码时,我得到 2
作为我期望的答案 1
。
public class Test{
public static void main(String[] args) {
TimeZone eu = TimeZone.getTimeZone("Europe/Berlin");
Locale de = Locale.forLanguageTag("de");
int firstDayOfWeek = Calendar.getInstance(eu, de).getFirstDayOfWeek();
System.out.println(firstDayOfWeek);
}
}
谁能帮我理解这种行为。
看看 docs:
Gets what the first day of the week is; e.g., SUNDAY in the U.S., MONDAY in France.
和here:
public static final int MONDAY 2
这表明 return 值取决于语言环境。
如果我们打印这个:
System.out.println(firstDayOfWeek == Calendar.MONDAY);
我们会看到 true
。这意味着一周的第一天确实是星期一。只是你以为周一编码为1,其实周日编码为1。
根据 the javadoc,MONDAY 的值为 2。
Locale de = Locale.forLanguageTag("de");
WeekFields wf = WeekFields.of(de);
DayOfWeek firstDayOfWeek = wf.getFirstDayOfWeek();
System.out.println(firstDayOfWeek);
这会打印:
MONDAY
不要使用令人困惑的旧 Calendar
class。你得到 2 作为一周的第一天。但是你不是应该得到 1 吗?还是0?星期几是如何编号的?忘记数字,使用 java.time
中的 DayOfWeek
枚举,现代 Java 日期和时间 API。
要获得更漂亮的输出,请使用 DayOfWeek.getDisplayName
或 DateTimeFormatter
。如果确实需要数字,请使用 DayOfWeek.getValue
:
System.out.println(firstDayOfWeek.getDisplayName(TextStyle.FULL, de));
System.out.println(firstDayOfWeek.getValue());
输出为:
Montag
1
PS 也不要使用 TimeZone
和其他过时的日期和时间 classes。 java.time
更好用。这个例子很好地展示了这个事实,但它很典型,当然不是巧合。
Link: Oracle tutorial: Date Time 解释如何使用 java.time
.