Java 简化格式周年
一周一年与一周一年的周期同步。第一周和最后一周(含)之间的所有周都具有相同的周-年值。因此,一周中的第一天和最后一天可能具有不同的日历年值 例如,1998年1月1日是星期四。如果getFirstDayOfWeek()是星期一,getMinimalDaysInFirstWeek()是4(ISO 8601标准兼容设置),则1998年第1周从1997年12月29日开始,到1998年1月4日结束。1997日历年最后三天的年份为1998年。但是,如果getFirstDayOfWeek()是星期天,那么1998年的第1周从1998年1月4日开始,到1998年1月10日结束;1998年的前三天是1997年第53周的一部分,其周年为1997年 正如医生所说,如果我将FirstDayOfWeek设置为SUNDAY,将MinimalDaysInFirstWeek设置为4,那么1998-01-01的周年应该是1997年,但junit的结果是1998年Java 简化格式周年,java,date,simpledateformat,week-number,java.util.calendar,Java,Date,Simpledateformat,Week Number,Java.util.calendar,一周一年与一周一年的周期同步。第一周和最后一周(含)之间的所有周都具有相同的周-年值。因此,一周中的第一天和最后一天可能具有不同的日历年值 例如,1998年1月1日是星期四。如果getFirstDayOfWeek()是星期一,getMinimalDaysInFirstWeek()是4(ISO 8601标准兼容设置),则1998年第1周从1997年12月29日开始,到1998年1月4日结束。1997日历年最后三天的年份为1998年。但是,如果getFirstDayOfWeek()是星期天,那么19
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, 1998);
calendar.set(Calendar.MONTH, 0);
calendar.set(Calendar.DAY_OF_MONTH, 1);
calendar.setMinimalDaysInFirstWeek(4);
calendar.setFirstDayOfWeek(Calendar.SUNDAY);
System.out.println(calendar.getTimeZone());
System.out.println(calendar.getMinimalDaysInFirstWeek());
System.out.println(calendar.getFirstDayOfWeek());
SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-dd");
System.out.println(sdf.format(calendar.getTime()));
junit的结果是:
sun.util.calendar.ZoneInfo[id=“亚洲/上海”,偏移量=2880000,DSTSAVIES=0,useDaylight=false,转换=29,lastRule=null]
四,
一,
1998-01-01TL;DR:格式化程序使用自己的周编号 日期格式化程序使用自己的周编号方案,而不是日期的编号方案(在您的示例中是
日历
对象的编号方案)。我正在演示如何使用java.time这个现代java日期和时间API。具体来说,我使用的是LocalDate
。LocalDate
始终是ISO日历系统中的日期
LocalDate date = LocalDate.of(1998, Month.JANUARY, 1);
DateTimeFormatter baseFormatter = DateTimeFormatter.ofPattern("YYYY-MM-dd");
DateTimeFormatter chinaFormatter = baseFormatter.withLocale(Locale.CHINA);
System.out.println("China: " + date.format(chinaFormatter));
DateTimeFormatter franceFormatter = baseFormatter.withLocale(Locale.FRANCE);
System.out.println("France: " + date.format(franceFormatter));
DateTimeFormatter irelandFormatter = baseFormatter.withLocale(Locale.forLanguageTag("en-IE"));
System.out.println("Ireland: " + date.format(irelandFormatter));
此代码段的输出为:
- 如果默认区域设置为China,则格式化程序使用的是China weeks。它们从周日开始,第一周是包含1月1日的一周(另一个例子是在美国)。因此,1998年1月1日必须属于1998年的一周
- 法国使用ISO编号:本周从周一开始,正如您所说,在本例中,1998年第1周从1997年12月29日开始。我们又到了1998年
- 爱尔兰是为数不多的几个使用你在问题中试图获得的混合计划的国家之一:第一周的最少天数为4天(如ISO所示),周日是一周的第一天(如中国和美国)。因此,使用爱尔兰作为地区国家的格式化程序可以得到您想要得到的结果,1997年
周字段
对象放在一起。那你就不必担心语言环境了
WeekFields myWeekFields = WeekFields.of(DayOfWeek.SUNDAY, 4);
int weekYear = date.get(myWeekFields.weekBasedYear());
System.out.println("Week year: " + weekYear);
年份:1997年
java.time???
您所使用的日期和时间类,Calendar
和SimpleDateFormat
,设计不良且早已过时
从您的文档链接来看,您似乎正在使用Java8,如果是这样,那么您完全没有理由要与旧类斗争。像上面一样使用java.time。Java6和Java7的后端口也存在
问题中的代码为什么不起作用?
您正在使用
Calendar.getTime()
从日历中抽出时间。这将返回一个日期
(另一个设计拙劣且早已过时的类)。日期是一个时间点,仅此而已。它没有周数或周年的概念。您将此日期
传递给您的SimpleDateFormat
,后者无法检测到日期
最初来自日历
对象,该对象在第一周和一周的第一天具有特定的天数设置。相反,SimpleDateFormat
使用自己的周定义。它总是这样。由于您没有为SimpleDataFormat
显式设置区域设置或日历,因此它使用了JVM的默认区域设置。这产生了1998年的一周,就像在绝大多数地区一样。那么你的问题是什么?@mentalurg,根据DOC,1998-01-01的一周应该是1997年,但junit的结果显示是1998年,而不是1997年。嗯,也许你混淆了docu,或者你混淆了日历。getFirstDayOfWeek()
实际上正在返回。我猜如果第一天被定为星期天,你会发现1998年的第一周应该是4-1-1998??也许你在找这个<代码>calendar.set(calendar.DAY\u OF_WEEK,calendar.getFirstDayOfWeek())
并在第天删除手动设置。@hiway:我刚刚检查了它:getWeekYear()return 1997以获取YOUR代码。向代码显示您如何获得一周中的年份。我建议您不要使用日历
和SimpleDateFormat
。这些类设计得很糟糕,而且早已过时,后者尤其是出了名的麻烦。相反,使用来自的LocalDate
和DateTimeFormatter
。很好的解释,我们的项目从java7迁移到java8,CTO要求我们不要使用YYYY-MM-dd
格式化日期,在阅读Java文档示例后,我感到困惑。现在我明白了,我将使用新类。非常感谢。
WeekFields myWeekFields = WeekFields.of(DayOfWeek.SUNDAY, 4);
int weekYear = date.get(myWeekFields.weekBasedYear());
System.out.println("Week year: " + weekYear);