Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java日历周/年不符合ISO-8601?_Java_Date_Iso - Fatal编程技术网

Java日历周/年不符合ISO-8601?

Java日历周/年不符合ISO-8601?,java,date,iso,Java,Date,Iso,ISO-8601标准规定: “一年中的第一周是包含第一个星期四的一周 (因此,始终包含1月4日)。” 也就是说,一年中的第一周不是指一月一日,而是指新年后至少四天的第一周 根据周一的说法,2016年1月11日是第2周 Ubuntu在其时间窗口小部件中反映了这一点: cal命令还执行以下操作: Oracle使用TO_CHAR的“iw”参数来支持它: > select to_char(to_date('11/01/2016','dd/mm/yyyy'),'iw') weekno from

ISO-8601标准规定:

“一年中的第一周是包含第一个星期四的一周 (因此,始终包含1月4日)。”

也就是说,一年中的第一周不是指一月一日,而是指新年后至少四天的第一周

根据周一的说法,2016年1月11日是第2周

Ubuntu在其时间窗口小部件中反映了这一点:

cal命令还执行以下操作:

Oracle使用
TO_CHAR
的“iw”参数来支持它:

> select to_char(to_date('11/01/2016','dd/mm/yyyy'),'iw') weekno from dual;
> WEEKNO
    02
但爪哇说,周一,2016年1月11日是第三周

Java认为一年中的第一周是包含1月1日的一周


-Java有没有办法使用ISO-8601-copliant周编号?

正如我在评论中指出的,默认行为是特定于语言环境的。有些地区会给出3,有些地区会给出2

幸运的是,对于给定的
日历
,您可以指定一年中第一周必须出现的天数。如上所述,对于ISO 8601,这个数字是
4
,因此以下代码应该可以工作:

Calendar c = Calendar.getInstance();
c.setMinimalDaysInFirstWeek(4); // For ISO 8601
System.out.println(c.getTime());
System.out.println(c.get(Calendar.WEEK_OF_YEAR));
无论语言环境如何,这都会使输出正确

测试输出:

Mon Jan 11 14:54:22 CET 2016
2
tl;博士 ……还有

myZonedDateTime.get( IsoFields.WEEK_BASED_YEAR )
避免遗留日期时间类 如所述,
日历
类对周的定义因地区而异。虽然这是出于好意,但令人困惑

您应该避免使用
日历
和相关类,如
日期
。它们现在被java.time类取代

ISO 8601每周 至于,请明确这意味着:

  • 第一天是星期一,一直持续到星期天
  • 基于周的年份的第一周包含日历年的第一个星期四
  • 以周为基础的年份有52周或53周
  • 日历年的前几天/最后几天可能出现在基于上一周/下一周的年份中
java.time time类包括对的有限支持。对各种类(如和)调用
get
方法。将在类中找到的实现作为常量传递

额外加三十 更好的是,将库添加到项目中以使用类

小心日历软件设置 永远不要假设周数的定义。确保此类数字的来源具有与您相同的周定义,例如ISO 8601定义

例如,with macOS默认为“公历”周定义。至于这意味着什么,我不知道,因为我找不到任何关于其意图/定义的文件。对于ISO 8601周,您必须


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

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

从哪里获得java.time类

  • ,及以后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类
    • 对于早期的Android,该项目采用了ThreeTen Backport(如上所述)。看

该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。您可以在这里找到一些有用的类,例如、、和。

它是特定于语言环境的。例如,将默认的
Locale
设置为
Locale.UK
将给出正确的周数2。但这将改变周数之外的其他内容!是的,有关更好的方法,请参见下面的答案。:-)
myZonedDateTime.get( IsoFields.WEEK_OF_WEEK_BASED_YEAR ) 
myZonedDateTime.get( IsoFields.WEEK_BASED_YEAR )
int week = myZonedDateTime.get( IsoFields.WEEK_OF_WEEK_BASED_YEAR ) ;
int weekBasedYear = myZonedDateTime.get( IsoFields.WEEK_BASED_YEAR ) ;
org.threeten.extra.YearWeek yw = YearWeek.from( myZonedDateTime ) ;