为什么2010年12月31日将作为一年中的一周返回1?

Osc*_*Ryz 26 java calendar jodatime week-number

例如:

Calendar c = Calendar.getInstance();
DateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
c.setTime( sdf.parse("31/12/2010"));
out.println( c.get( Calendar.WEEK_OF_YEAR ) );  
Run Code Online (Sandbox Code Playgroud)

打印1

Joda时间也是如此.

:)

Ral*_*lph 53

每周的定义Locale取决于.

在其他帖子中讨论了如何在美国定义它.例如在德国(DIN 1355-1/ISO 8601):第一周*是第一周,在新的一年中有4天或更多天.

*周的第一天是星期一,星期的最后一天是星期日

而Java则Calendar关注语言环境.例如:

public static void main(String[] args) throws ParseException {

    DateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    Date lastDec2010 = sdf.parse("31/12/2010");

    Calendar calUs = Calendar.getInstance(Locale.US);       
    calUs.setTime(lastDec2010);

    Calendar calDe = Calendar.getInstance(Locale.GERMAN);       
    calDe.setTime(lastDec2010);

    System.out.println( "us: " + calUs.get( Calendar.WEEK_OF_YEAR ) ); 
    System.out.println( "de: " + calDe.get( Calendar.WEEK_OF_YEAR ) );
}
Run Code Online (Sandbox Code Playgroud)

打印:

us: 1
de: 52
Run Code Online (Sandbox Code Playgroud)

增加 对于美国(我可以想到墨西哥也是如此)1.一周是1月1日所属的那一周. - 因此,如果1. Januar是星期六,那么星期五(星期三)是同一周,在这种情况下,这一天属于2011年的一周.


Ada*_*dam 9

为WEEK_OF_YEAR字段计算的值范围为1到53.一年的第1周是从getFirstDayOfWeek()开始的最早的七天时间段,该时间段至少包含该年的getMinimalDaysInFirstWeek()天.因此,它取决于getMinimalDaysInFirstWeek(),getFirstDayOfWeek()和1月1日的星期几的值.一年的第1周和第二年的第1周之间的周数从2到52或53顺序编号(如需要).

要确定该周是2010年的最后一周还是2011年的第一周,Java使用的是getMinimalDaysInFirstWeek javadoc.如果该方法返回7,则该周的所有日期都是同一年的第一周是第一周,如果它返回1,那么第一周与下一年的任何日期是下一年的第一周.

在这种情况下,2011年1月的第一天是星期六所以它被认为是2011年的第一周,只要你想要一周一周被认为已经是明年的第一周,如果你不这样做然后做:

Calendar c = Calendar.getInstance();
c.setMinimalDaysInFirstWeek(7);//anything more than 1 will work in this year
DateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
c.setTime( sdf.parse("31/12/2010"));
System.out.println( c.get( Calendar.WEEK_OF_YEAR ) ); 
Run Code Online (Sandbox Code Playgroud)

收益:

52
Run Code Online (Sandbox Code Playgroud)


Bas*_*que 5

太长了;博士

\n\n
java.time.LocalDate.parse( \n    "31/12/2010" , \n    DateTimeFormatter.ofLocalizedDate( FormatStyle.SHORT ).withLocale( Locale.UK )  \n)      \n.get( IsoFields.WEEK_OF_WEEK_BASED_YEAR )\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

52

\n
\n\n

或者,添加一个库,然后\xe2\x80\xa6

\n\n
org.threeten.extra.YearWeek.from(     // Convert from a `LocalDate` object to a `YearWeek` object representing the entire week of that date\xe2\x80\x99s week-based year.\n    java.time.LocalDate.parse( "31/12/2010" , DateTimeFormatter.ofLocalizedDate( FormatStyle.SHORT ).withLocale( Locale.UK )  \n).getWeek()                           // Extract an integer number of that week of week-based-year, either 1-52 or 1-53 depending on the year.\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

52

\n
\n\n

java.time

\n\n

正如其他人指出的那样,一周的定义Locale在旧版本中有所不同java.util.Calendar

\n\n

那个麻烦的类及其伙伴java.util.Date已被 java.time取代框架所取代。

\n\n

该课程使用ISO 8601IsoFields定义一周:周始终从星期一开始,第 1 周包含日历年的第一个星期四。

\n\n

获取当前时刻。

\n\n
ZoneId zoneId = ZoneId.of ( "America/Montreal" );\nZonedDateTime now = ZonedDateTime.now ( zoneId );\n
Run Code Online (Sandbox Code Playgroud)\n\n

询问标准的基于周的年份。

\n\n
int week = now.get ( IsoFields.WEEK_OF_WEEK_BASED_YEAR );\nint weekYear = now.get ( IsoFields.WEEK_BASED_YEAR );\n
Run Code Online (Sandbox Code Playgroud)\n\n

标准周定义

\n\n

有多种方法可以定义 \xe2\x80\x9ca week\xe2\x80\x9d 和 \xe2\x80\x9cfirst week of theyear\xe2\x80\x9d。

\n\n

然而,有一个主要的标准定义ISO 8601 标准。该标准定义了一年中的几周,包括一年中的第一周。

\n\n
\n

当年第一个星期四的那一周

\n
\n\n

标准周从星期一开始,到星期日结束。

\n\n

以周为基础的一年的第 1 周是该日历年的第一个星期四。

\n\n

java.time类通过该类支持 ISO 8601 周,并保存三个实现的常量IsoFieldsTemporalField

\n\n\n\n

致电LocalDate::get访问TemporalField.

\n\n
LocalDate ld = LocalDate.parse( "2010-12-31" ) ;\nint weekOfWeekBasedYear = ld.get( IsoFields.WEEK_OF_WEEK_BASED_YEAR ) ;\nint yearOfWeekBasedYear = ld.get( IsoFields.WEEK_BASED_YEAR ) ;\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

ld.toString(): 2010-12-31

\n\n

weekOfWeekBasedYear: 52

\n\n

基于年份的年份:2010

\n
\n\n

ISO 8601 字符串格式

\n\n

ISO 8601 标准定义了文本格式以及基于周的年份值的含义:yyyy-Www. 对于特定日期,请为周一至周日添加编号为 1-7 的星期几:yyyy-Www-d

\n\n

构造这样一个字符串。

\n\n
String outputWeek = String.format( "%04d" , yearOfWeekBasedYear ) + "-W" + String.format( "%02d" , weekOfWeekBasedYear ) ;\nString outputDate = outputWeek + "-" + ld.getDayOfWeek().getValue() ;\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

2010-W52-5

\n
\n\n

YearWeek

\n\n

如果您将ThreeTen-Extra库添加到您的项目中,这项工作会容易得多。然后使用该类YearWeek

\n\n
YearWeek yw = YearWeek.from( ld ) ;  // Determine ISO 8601 week of a `LocalDate`. \n
Run Code Online (Sandbox Code Playgroud)\n\n

生成标准字符串。

\n\n
String output = yw.toString() ;\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

2010-W52

\n
\n\n

并解析。

\n\n
YearWeek yearWeek = YearWeek.parse( "2010-W52" ) ;  \n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

年周.toString(): 2010-W52

\n
\n\n

确定日期。传递java.time.DayOfWeek星期一至星期日的星期几的枚举对象。

\n\n
LocalDate localDate = yw.atDay( DayOfWeek.MONDAY ) ;\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

localDate.toString(): 2010-12-27

\n
\n\n

我强烈建议将此库添加到您的项目中。然后你可以传递智能对象而不是哑整数。这样做可以使您的代码更加自文档化,提供类型安全并确保有效值。

\n\n
\n\n

关于java.time

\n\n

java.time框架内置于 Java 8 及更高版本中这些类取代了麻烦的旧遗留日期时间类,例如java.util.Date, Calendar, & SimpleDateFormat

\n\n

Joda -Time项目现在处于维护模式,建议迁移到java.time类。

\n\n

要了解更多信息,请参阅Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

\n\n

使用与JDBC 4.2或更高版本兼容的JDBC 驱动程序,您可以直接与数据库交换java.time对象。不需要字符串也不需要 java.sql.* 类。

\n\n

从哪里获取 java.time 类?

\n\n\n\n

ThreeTen -Extra项目通过附加类扩展了 java.time。该项目是 java.time 未来可能添加的内容的试验场。您可能会在这里找到一些有用的类,例如Interval、、、等等。YearWeekYearQuarter

\n\n
\n\n

有关更多详细信息,请参阅对类似问题的回答:

\n\n\n\n

\xe2\x80\xa6 并查看对类似问题的回答:

\n\n\n