根据Java中的Weeks查找Quarter

时间:2014-02-18 17:43:34

标签: java date datetime week-number

我正在尝试使用Java中的日历类来获得一年中的季度。我得到如下的当前日期,并使用WEEK_OF_YEAR变量得到如下的一周,但低于输出对我来说没有多大意义,因为本周不是今年的第三周。

Calendar cal = Calendar.getInstance();
System.out.println(dateFormat.format(cal.getTime()));
System.out.println("week of year: "+cal.WEEK_OF_YEAR);

output: 2014/02/17
week of year: 3

我想要做的是,我希望低于季度(目前Quarter1正在运行,下一季度是Quarter2)作为结果并在我的应用程序上使用它。

Quarter1 is from Week 1 to Week 12.
Quarter2 is from Week 13 to Week 24.
Quarter3 is from Week 25 to Week 37.
Quarter4 is from Week 38 to the end of the year.

请帮助我,让我知道如何找到上面提到的宿舍。

2 个答案:

答案 0 :(得分:7)

Calendar.WEEK_OF_YEAR是常数。你想要cal.get(Calendar.WEEK_OF_YEAR)

但是,你应该注意到“一年中的一周”并不像你想象的那么简单,作为一个概念。例如,它可以在1月1日为53,属于某些年份的前一周。你是否对一年中的第一季度比1月1日晚开始感到高兴?

(除非您真的需要使用一周/周/周/周的代表用于商业目的,年/月/日更容易理解。)

如果你需要在阅读这些警告后将一周中的一周翻译成一个季度,你可以使用:

public static int getQuarter(Calendar calendar) {
    int weekOfYear = calendar.get(Calendar.WEEK_OF_YEAR);
    return weekOfYear < 13 ? 1
         : weekOfYear < 25 ? 2
         : weekOfYear < 38 ? 3
         : 4;
}

答案 1 :(得分:0)

answer by Jon Skeet是正确的,应该被接受。获得该三元巫术的奖励积分。 : - )

如果您搜索StackOverflow,您将找到更常见的问题,即确定已经多次询问和回答的季度(以及月份和周数)。此外,搜索StackOverflow“java week”以查找有关处理时间跨度的有用说明。添加“joda”到那个搜索,你会更好。

请记住,时区非常关键,它定义了第一天定义的第一个时刻。

one answer of mine中,我展示了如何使用Joda-Time获得第一个月,然后重复添加3个月,如果这是您对季度开始的定义。

DateTimeZone timeZone = DateTimeZone.forID( "America/Montreal" );
DateTime q1_2014 = new DateTime( 2014, 1, 1, 0, 0, 0, timeZone );
DateTime q2_2014 = q1_2014.plusMonths( 3 );
…

Joda-Time提供3个类来定义可能对您有用的时间跨度:句点,持续时间,尤其是Interval

DateTimeZone timeZone = DateTimeZone.forID( "America/Montreal" );
DateTime yearStart = new DateTime( 2014, 1, 1, 0, 0, 0, timeZone );
Interval q1 = new Interval( yearStart, yearStart.plusMonths( 3 ) );
Interval q2 = new Interval( q1.getEnd(), q1.getEnd().plusMonths( 3 ) );
…
boolean isNowInQ1 = q1.contains( DateTime.now() );

Interval使用“半开”方法进行比较,这意味着开始是包容性的,结束是排他性的。这是一种合理且有用的时间跨度方法。

再次,搜索StackOveflow以获得更多讨论和许多示例。