从时间戳构建一个日历,对应于2011年1月1日星期六00:00:00 GMT。
相同的代码,使用java.util.Date、Calendar和TimeZone,在不同的机器上(具有相同的区域设置)的行为不同;除了WEEK_OF_YEAR之外,日历中的所有字段都是相同的。在我的机器上,它是52(实际上是我的两台机器)。在我的同事机器上,它是1(似乎是正确的)。
import java.util.Date;
import java.util.TimeZone;
import java.util.Calendar;
import java.util.Locale;
public class CalendarTest {
public static void main(String[] args) {
Locale l = Locale.getDefault();
System.out.println(l);
Long d = new Long(1293840000000l);
Calendar c = Calendar.getInstance();
c.setTimeZone(TimeZone.getTimeZone("UTC"));
c.setTime(new Date(d));
System.out.println(c.toString());
}
本地化为en_US,但日历是:
>java.util.GregorianCalendar[time=1293840000000,
areFieldsSet=true,
areAllFieldsSet=true,
lenient=true,
zone=sun.util.calendar.ZoneInfo[
id="UTC",
offset=0,
dstSavings=0,
useDaylight=false,
transitions=0,lastRule=null
],
firstDayOfWeek=2,
minimalDaysInFirstWeek=4,
ERA=1,
YEAR=2011,
MONTH=0,
WEEK_OF_YEAR=52,
WEEK_OF_MONTH=0,
DAY_OF_MONTH=1,
DAY_OF_YEAR=1,
DAY_OF_WEEK=7,
DAY_OF_WEEK_IN_MONTH=1,
AM_PM=0,HOUR=0,
HOUR_OF_DAY=0,
MINUTE=0,
SECOND=0,
MILLISECOND=0,
ZONE_OFFSET=0,
DST_OFFSET=0]
可能是什么原因导致这个周数不一致?
firstDayOfWeek=2
,这是“不寻常的”。我测试了Locale.US
和*所有可用的TimeZone
(在Java7和Java8上都是如此),没有任何组合会显示firstDayOfWeek=2
的结果。再次强调,提供一些实际设置的更多信息可能会有所帮助(并且可能需要一个易于比较的输出版本 - 它几乎肯定会说firstDayOfWeek=1
... 但是我还没有弄清楚差异可能来自哪里....) - Marco13