【问题标题】:android java, week number of a date is incorrectandroid java,日期的周数不正确
【发布时间】:2016-01-12 10:35:05
【问题描述】:

在我的 android 应用程序中,我正在努力获取所提供日期的周数。但它没有给我正确的周数我正在使用以下代码来获取周数。

String format = "dd-MM-yyyy";
SimpleDateFormat df = new SimpleDateFormat(format);
Date date = df.parse(date);
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int week = cal.get(Calendar.WEEK_OF_YEAR);

但这并没有给我我所期望的。例如,让我们以 2016 年 1 月为例。

截至 2016 年 1 月 从上面的 日历 可以看出,天数属于周数 1 只有 1st,2nd第三个。对于第 2 周,相关日期为 4th、5th、6​​th、7th、8th、9th 和 10th。那么对于第 3 周,相关日期为 11 日、12 日、13 日、14 日、15 日、16 日和 17 日,以此类推。但是对于日期 12/01/2016,上面的代码给了我周数 2 而不是周数 3。我做错了什么还是这个功能正常工作的方式。如上所述,我怎样才能实现获得周数的目标。

【问题讨论】:

  • 正如你所说的 '12/01/2016' 返回 2,但在这种情况下是 '01/01/2016' 返回 0 或 53 还是其他?
  • 如果您了解Joda-TimeISO 8601,生活会轻松很多。

标签: java android date


【解决方案1】:

1 月 1 日、2 日和 3 日实际上是 2015 年的第 53 周。代码运行正常,您对周编号的假设是错误的。 GregorianCalendar 的默认行为与Wikipedia 中第一周的 ISO 定义相同:

第 01 周的 ISO 8601 定义是一年的第一周 星期四在里面。以下定义基于 this 的性质 周是相互等价的,因为 ISO 周从星期一开始:

  • 这是第一周,大部分(4 天或更多)天在 1 月。
  • 第一天是最接近 1 月 1 日的星期一。
  • 其中包含 4 月 4 日。因此,最早的可能日期是 12 月 29 日至 1 月 4 日,最晚是 1 月 4 日至 10 日。
  • 如果星期六、星期日和 1 月 1 日不是工作日,则其中包含一年的第一个工作日。

如果 1 月 1 日是星期一、星期二、星期三或星期四,则它在 第 01 周。如果 1 月 1 日是星期五,那么它是第 53 周的一部分 上一年;如果在星期六,它是第 52 周的一部分(或 53,如果 前一年是闰年);如果在星期天,它是第 52 周的一部分 上一年的。

【讨论】:

  • 不正确的答案旧的 java.util.Calendar 类使用 ISO 8601 定义的星期。对于 ISO 8601,请使用 Joda-Time 库或 Java 8 及更高版本中内置的 java.time 框架。
【解决方案2】:

发现于https://docs.oracle.com/javase/7/docs/api/java/util/GregorianCalendar.html

为 WEEK_OF_YEAR 字段计算的值范围为 1 到 53。日历年的第一周是从 getFirstDayOfWeek() 开始的最早 7 天时间段,其中至少包含 getMinimalDaysInFirstWeek() 天数年。因此,它取决于 getMinimalDaysInFirstWeek()、getFirstDayOfWeek() 和 1 月 1 日的星期几的值。

因此,您的第一周将是第 0 周,因为它从您第一个完整的 7 天周开始计算。您可以通过将 getMinimalDaysInFirstWeek() 设置为较低的值来更改此设置

【讨论】:

  • 更糟糕的是,getFirstDayIfWeek 的结果因Locale 而不同。避免使用这些笨拙的旧日期时间类。尽可能快地运行到Joda-Time 库。
猜你喜欢
  • 2021-04-06
  • 1970-01-01
  • 2012-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多