当前位置: 首页 > 知识库问答 >
问题:

JSR-310中两种不同的周年定义的动机是什么?

申屠秦斩
2023-03-14

Isofields.week_based_year

WeekFields.iso.WeekBasedYear()

ISO-8601定义了一个所谓的星期日期,除了其他两种日期,即通常的日历日期(由年、月和日组成)和序号日期(由年和日组成)。周日期以yyyy-'w'ww-e格式定义。w代表一年中的一周,e代表数字中的一周中的一天。Y代表以周为单位的一年,与日历年相同,但日历年的开始或结束除外,因为以周为单位的一年与周周期相联系,周周期最终可以从前一年开始。要理解一周日期是如何形成的,有两个规则很重要:

    null
LocalDate date1 = 
  LocalDate.of(2000, 2, 29).with(IsoFields.WEEK_BASED_YEAR, 2014);
System.out.println("IsoFields-Test: " + date1); // output: 2014-03-01

LocalDate date2 = 
  LocalDate.of(2000, 2, 29).with(WeekFields.ISO.weekBasedYear(), 2014);
System.out.println("WeekFields-Test: " + date2); // output: 2014-02-25

日期2000-02-29对应于ISO Weekdate表示法中的2000-W09-2,而2014-02-25对应于保留一年中的一周和一周中的一天的2014-W09-2。到目前为止还好。保留较小字段的特性类似于如何更改日历年的规则(在大多数情况下,应保持日历日期中的月份和月日不变)。

但是2014-03-01的结果是什么呢?在这里,算法简单地在相应的周日期上增加了四天,以便考虑到“月日”字段中的差异(29对25)。我没有找到这种行为的任何来源或官方文件。有人知道我们在哪里可以找到这两个领域之间差异的理由吗?有关于算法行为的文档吗?

更新:

System.out.println(
  "14 week-based-years later = "
  + LocalDate.of(2000, 2, 29).plus(14, IsoFields.WEEK_BASED_YEARS));
LocalDate d = LocalDate.of(2014, 3, 1); // 2014-W09-6
System.out.println(
  "week-of-year in 2014-03-01: " 
  + d.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR));
System.out.println(
  "day-of-week in 2014-03-01: " 
  + d.get(ChronoField.DAY_OF_WEEK));

LocalDate later = d.plus(14, IsoFields.WEEK_BASED_YEARS); // 2028-03-02 = 2028-W09-4
System.out.println(
  "14 week-based-years later = " 
  + later);
System.out.println(
  "week-of-year in " + later + ": " 
  + later.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR));
System.out.println(
  "day-of-week in " + later + ": " 
  + later.get(ChronoField.DAY_OF_WEEK));

产出:

week-of-year in 2014-03-01: 9
day-of-week in 2014-03-01: 6
14 week-based-years later = 2028-03-02
week-of-year in 2028-03-02: 9
day-of-week in 2028-03-02: 4

我不承认任何明确的规则。在增加14周为基础的年份时,既不保留周日,也不保留月日。所以这是一个额外的问题:isofields.week_based_years背后的规则是什么?也许JSR-310-team能给我们一些启发?

共有1个答案

符俊材
2023-03-14

这是isofields中的一个bug,由于该方法未经测试(对此很抱歉),该bug得以通过。正确实现后,isofieldsweekfields.iso之间应该没有什么明显的差异。

请查看bug报告和补丁,这些补丁最终将在系统中运行并得到修复。

注意,测试显示获取字段没有问题,该bug只影响with/adjustinto方法的week_based_year。单元week_based_years受到影响,因为添加是通过重用中断的week_based_years在内部实现的。

 类似资料:
  • 问题内容: 这是包中的两个字段: IsoFields.WEEK_BASED_YEAR WeekFields.ISO.weekBasedYear() ISO-8601除了其他两种日期之外,还定义了所谓的星期日期,即通常的日历日期(由年,月和日组成)和顺序日期(由年和日组成) )。 周日期以YYYY-‘W’ww-e格式定义 。w代表星期,e代表数字ISO星期。Y代表以周为基础的年份,并且与日历年相同,

  • 问题内容: 您能否说明一下如何为默认系统时区和给定时区获取正确的纪元时间(以毫秒为单位)。 给定 1.时区:GMT + 3 2.以下代码段: 3.输出: 4. System.currentTimeMillis()的 JavaDoc,它指示返回值将是 当前时间与UTC 1970年1月1日午夜之间的差(以毫秒为单位)。 所以为什么 at 的输出与of的输出相同,尽管提及的文档? at 的输出与有所不同

  • 这是代码: 如果我在我的机器()或这里()上尝试: 相反,这里(): 这是不同的。这是由于机器厄普西隆?还是编译器精度标志?还是不同的评估? 造成这种漂移的原因是什么?问题似乎出现在函数中(因为其他值似乎相同)。

  • 和有什么区别? 我对。class文件进行了反编译,发现在第一种情况下,JVM将使用multianwearray来创建数组,而在第二种情况下,它将使用AneWarRay。 我认为在第一种情况下,JVM将创建一个连续的空间。我说的对吗?

  • 问题内容: 我有以下情况:我在AngularJS应用程序中使用ui- router进行路由。在一种途径中,有五个子状态用于不同的子屏幕。我想以类似轮播的方式为它们之间的过渡设置动画。 导航如下所示: 从导航至应该向左滑动并从右侧向内滑动;反之亦然,用于从导航到。 什么工作是与所述屏幕转换上,并在 一个 唯一的方向。 通常,我使用标志来控制动画。但是,在这种情况下,在元素上设置类根本不起作用(Ang

  • 我有一个live javafx用户应用程序,它有一个标签: