年代和周年之间的差异?

Bri*_*ian 37 java datetime date java-8 java-time

Java的8位的DateTimeFormatter类有一个方法,ofPattern(String pattern)即让您从一串定义的格式A-z,a-z信件.这些例子并没有明确的区别y,今年的时代Y,以星期为一年.它是什么?

Symbol  Meaning                     Presentation      Examples
------  -------                     ------------      -------
 y       year-of-era                 year              2004; 04
 Y       week-based-year             year              1996; 96
Run Code Online (Sandbox Code Playgroud)

小智 36

这是"年 - 周"风格日期的年份值,如2006W52.如果所涉及的一周跨越年份界限,它可能会在年代的价值中减去+1或-1.

http://en.wikipedia.org/wiki/ISO_8601#Week_dates

  • 正确答案.为了解释,一些应用程序在周一到周日*整周*周跟踪时间.第一周定义为一年中第一个星期四的一周.[2014年第一周](http://www.epochconverter.com/date-and-time/weeknumbers-by-year.php)于2013年12月30日开始,截止日期为2014年1月5日.所以周 - 2013年12月30日和31日均为"2014". (12认同)
  • 用同一个字母'yy'和'YY'命名两个不同的东西是一个等待发生的事故.它就像Y2K但每年都有. (4认同)

Bas*_*que 24

tl;博士

显示 2019-12-30 日历年的表格是 2019 年,而基于周的年份是 2020 年

显示日历年和基于周的年的天数和周数长度的表格,365 或 366 天与 364 或 371 天,以及 52 个部分周与 52 或 53 个整周的长度。

细节

其他一些答案很有趣,但很复杂。这是一个希望更简单的答案,可以让您找到方向。

yu(小写)

y年代的字符只是日历年,西方和世界大部分地区使用的常规年份,基于公历

DateTimeFormatter班还采用u了几乎同样的事情。对于当代日期,没有区别。有关详细信息,请参阅uuuu与Javayyyy中的DateTimeFormatter格式化模式代码?.

对于我们在日常生活中使用的常规日期,您将使用格式模式解析或生成表示日期值的文本,例如:

DateTimeFormatter.ofPattern( "dd/MM/yyyy" ) ;
Run Code Online (Sandbox Code Playgroud)

…或者…

DateTimeFormatter.ofPattern( "dd/MM/uuuu" ) ;
Run Code Online (Sandbox Code Playgroud)

在任何一种情况下,2019 年 12 月 30 日星期一都将被解析如下:

LocalDate localDate = LocalDate.parse( "30/12/2019" ) ;
Run Code Online (Sandbox Code Playgroud)

localDate.toString(): 2019-12-30

Y (大写)

各个行业的许多人发现按周跟踪时间很有用,为一年中的每个星期分配一个数字。

有多种方法可以定义一周,例如从星期日或星期一开始。因此,有多种方法可以定义一年中的一周。第 1 周有 1 月 1 日吗?还是第 1 周有一年的第一个星期日?

ISO 8601标准,每周定义为起始于周一。第 1 周是新日历年的第一个星期四。

这个定义意味着以周为基础的一年有 52 或 53 个整周,总是 7 天(周一至周日),一年的长度为 364 天或 371 天。相比之下,一个日历年有 365 或 366 天,跨越 52 个部分周。

因此,日期 2019-12-30(2019 年 12 月 30 日,星期一)实际上是 2020 年基于周的年份的第一周。

显示 2020 年第 1 周的日历,从 2019 年 12 月 30 日开始。

  • 如果您需要生成或解析基于周的年份值2020YYYY请在格式模式中使用大写表示 2019-12-30 的日期。
  • 如果您想要 2019-12-30 的日历年,即2019,请使用小写yyyy

ISO 8601 格式

ISO 8601 标准定义了用于表示基于周的一年中一周内的日期的特定格式:YYYY-Www-d 其中 theYYYY是基于周的年份,the-W是固定的,theww表示周数 1-52 或 1 -53,d代表周一至周日运行 1-7 的星期几。

因此,2019 年 12 月 30 日星期一是:2020-W01-1表示基于周的 2020 年、一年的第一周和一周的第一天(星期一)。

要使用星期几解析 ISO 8601 周,我们可以使用DateTimeFormatter. 无需使用 定义格式模式YYYY,因为这项工作已经为您完成。使用内置的DateTimeFormatter.ISO_WEEK_DATE.

String output = localDate.format( DateTimeFormatter.ISO_WEEK_DATE ) ;
Run Code Online (Sandbox Code Playgroud)

2020-W01-1

同样,解析。

LocalDate localDate = 
    LocalDate.parse( 
        "2020-W01-1" , 
        DateTimeFormatter.ISO_WEEK_DATE
    )
;
Run Code Online (Sandbox Code Playgroud)

localDate.toString(): 2019-12-30

三十额外

ThreeTen-EXTRA库将功能添加到java.time内置Java类。

org.threeten.extra.YearWeek

该库提供了YearWeek类。如果您根据ISO 8601 对一周和基于周的年的定义使用基于周的年,那么这正是您所需要的。

这个类可以在常规日期格式和面向周的格式之间来回转换。

LocalDate localDate = LocalDate.of( 2019 , Month.DECEMBER , 30 ) ;  // Monday 2019-12-30. Its week-based year is 2020. 
YearWeek yearWeek = YearWeek.from( localDate ) ;
String wFormatted = yearWeek.toString() ;
Run Code Online (Sandbox Code Playgroud)

2020-W01

从中得到一个日期。

LocalDate localDate = yearWeek.atDay( DayOfWeek.MONDAY ) ;
Run Code Online (Sandbox Code Playgroud)

localDate.toString(): 2019-12-30


Jod*_*hen 6

每个字段记录在一个“现场”类,如ChronoFieldWeekFieldsIsoFields

“年龄”字段记录在中ChronoField

“基于星期的年份”字段记录在中WeekFields