如何确定从日期开始的周?

时间:2014-01-13 19:52:35

标签: java date

如何确定Java中给定日期的一周中的哪一周;开始日期是1月1日。我看到一些例子,例如使用Calendar.WEEK_OF_YEAR但是这是由区域设置定义的,导致开始日期不同。

要清楚;一年中的一周,我的意思是:从1月1日开始的一年中的52周中的哪一周。

在Stack上有许多与Calendar.WEEK_OF_YEAR的语言环境特定行为相关的问题;然而,我没有看到任何一个我需要的答案。

可能出现的问题是,对于Locale.US,一年中的第一周可能是上一年的最后一周;所以2013年12月31日将显示为2014年第1周。我已经看到Locale.GERMAN按照我的预期行事,但我不想使用它。

我想避免的典型建议:

Calendar aCalendar = new GregorianCalendar();
aCalendar.get(Calendar.WEEK_OF_YEAR);

2 个答案:

答案 0 :(得分:0)

ISO Week Date的维基百科页面上有一个公式

week(date) = (ordinal(date) - weekday(date) + 10) / 7

使用以下逻辑

  

方法:使用ISO工作日编号(从星期一的1到7的运行   星期日),从序数日期减去工作日,然后加10。   将结果除以7.忽略余数;商等于   周数。如果这样获得的周数等于0,则意味着   给定日期属于前一个(基于周的)年份。如果一周   获得53个,必须检查日期实际上不是   在第二年的第1周。

除此之外,使用Joda time和/或等待Java 8中的新java.time

答案 1 :(得分:0)

不明问题

如评论中所述......

  • 你没有明确定义几周的意思。定义各不相同一些行业或公司有自己独特的定义。有些甚至是任意选择的,这意味着你无法计算它们。
  • ISO 8601 数据元素和交换格式 - 信息交换 - 日期和时间的表示是一种正式标准,它精确定义了一周的含义。请参阅this brief descriptionthis diagram。各行业和全球的采用似乎都在增长。

Mac用户可以通过选中Preferences > Advanced > Show week numbers复选框查看日历应用中的周数。

约达时间

第三方开源日期时间库Joda-Time使用ISO 8601作为其默认值。这包括标准周。

DateTime对象知道其时区,并知道其标准的一周。

示例代码

// Better to specify a time zone explicitly than rely on default.
// This list is not quite up-to-date (read page for details): http://joda-time.sourceforge.net/timezones.html
DateTimeZone timeZone = DateTimeZone.forID("Europe/Paris");

DateTime dateTime = new DateTime( timeZone );
//DateTime dateTime = new DateTime( 2014, 2, 28, 0, 0, 0 );

DateTime.Property weekProp = dateTime.weekOfWeekyear();
int weekNumber = weekProp.get();
String weekString = weekProp.getAsText();

转储到控制台...

System.out.println( "now: " + dateTime );
System.out.println( "weekProp: " + weekProp );
System.out.println( "weekNumber: " + weekNumber );
System.out.println( "weekString: " + weekString );

跑步时......

now: 2014-01-14T05:57:55.635+01:00
weekProp: Property[weekOfWeekyear]
weekNumber: 3
weekString: 3