一天的季度?

时间:2016-04-07 06:54:05

标签: java

我如何实施dayNumber_of_quarter

E.g。 3月3日(Q1)应该返回62 = 31(1月)+ 28(2月)+ 3(3月)和4月29日(Q2)应该返回29.

到目前为止我的代码:

int month = getMonth(date);
int quarter = getQuarter(date);
int date1 = getDate(date);
int year = getYear(date);
int monthMod = month % 3;
if (monthMod == 0) monthMod = 3;
//System.out.println(monthMod);
int countNumDaysOfQuarter = 0;

if (monthMod == 1) countNumDaysOfQuarter = getDate(date);
if (monthMod == 2) countNumDaysOfQuarter = getDate(date) + getCountOfDaysInMonth(date1, month - 1, year); 
if (monthMod == 3) countNumDaysOfQuarter = getDate(date) + getCountOfDaysInMonth(date1, month - 1, year) + getCountOfDaysInMonth(date1, month - 2, year);

4 个答案:

答案 0 :(得分:1)

您是否尝试过使用joda time

  

Java SE 8之前的标准日期和时间类别很差。通过正面解决这个问题,Joda-Time成为Java SE 8之前Java事实上的标准日期和时间库。

然后您可以计算两个日期之间的天数

  1. 您季度的开始日期和
  2. 您季度的结束日期。
  3. 使用类似于以下的技术: Number of days between two dates in Joda-Time

    注意:每季度每年的费用天数(闰年)。所以你需要关心闰年,你确实需要指定一个包括年份而不仅仅是月份的完整日期,以便计算一个季度的天数。

答案 1 :(得分:1)

以下是使用Java 8的简单实现:

public static long dayOfQtr(LocalDate date) {
    LocalDate firstDayOfQtr = LocalDate.of(date.getYear(), (qtr(date) - 1) * 3 + 1, 1);
    return ChronoUnit.DAYS.between(firstDayOfQtr, date) + 1;
}
public static int qtr(LocalDate date) {
    return (date.getMonthValue() - 1) / 3 + 1;
}

<强> TEST

for (int i = 1; i <= 12; i++) {
    LocalDate date = LocalDate.of(2016, i, i);
    System.out.println(date + " is day " + dayOfQtr(date) + " of Q" + qtr(date));
}

<强>输出

2016-01-01 is day 1 of Q1
2016-02-02 is day 33 of Q1
2016-03-03 is day 63 of Q1
2016-04-04 is day 4 of Q2
2016-05-05 is day 35 of Q2
2016-06-06 is day 67 of Q2
2016-07-07 is day 7 of Q3
2016-08-08 is day 39 of Q3
2016-09-09 is day 71 of Q3
2016-10-10 is day 10 of Q4
2016-11-11 is day 42 of Q4
2016-12-12 is day 73 of Q4

答案 2 :(得分:0)

Below is a very basic implementation.

private static int getDayOfQtr() {
    final int[] daysYr = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    final int[] daysLeapYr = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    final int[] quarters = { 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4 };
    final int[] months = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
    int currQtr = 0;
    int dayOfQtr = 0;

    int currDay = Calendar.getInstance().get(Calendar.DATE);
    int currMth = Calendar.getInstance().get(Calendar.MONTH) + 1;
    int currYr = Calendar.getInstance().get(Calendar.YEAR);
    if (currMth % 3 == 0) {
        currQtr = currMth / 3;
    } else {
        currQtr = currMth / 3 + 1;
    }
    for (int qtr = 0; qtr < quarters.length; qtr++) {
        if (currQtr == quarters[qtr]) {
            if (currMth > months[qtr]) {
                if (currYr % 4 == 0) {
                    dayOfQtr += daysLeapYr[qtr];
                } else {
                    dayOfQtr += daysYr[qtr];
                }
            } else if (currMth == months[qtr]) {
                dayOfQtr += currDay;
            }
        }
    }
    return dayOfQtr;
}

答案 3 :(得分:0)

TL;博士

LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" );
int dayOfQuarter = (int) ChronoUnit.DAYS.between( 
    YearQuarter.from( today ).atDay( 1 ) , 
    today 
) + 1 ;  // Add one to get the ordinal rather than get index into quarter.

java.time

使用Java 8及更高版本中内置的java.time框架(带有Java 6&amp; 8和Android的后端),如Answer by Andreas所示。

ThreeTen-EXTRA

此外,您可以添加扩展java.time的ThreeTen-Extra库以提供额外的功能,其中一些最终可能会添加到java.time中。要使用此库,请将其jar文件添加到项目中(或使用Maven等)。

Quarter&amp; YearQuarter

ThreeTen-Extra库包含您可能觉得特别有用的QuarterYearQuarter类。更安全的是在代码中传递这些类型的对象,而不是使用字符串和数字来表示您的宿舍。

YearQuarter currentQuarter = YearQuarter.now ( ZoneId.of( "America/Montreal" ) );

YearQuarter有许多有用的方法,包括询问其日期。 LocalDate是一个仅限日期的值,没有时间和没有时区。

LocalDate start = currentQuarter.atDay ( 1 );
LocalDate lastday = currentQuarter.atEndOfQuarter ();

我们可以在特定日期获得该季度。

LocalDate localDate = LocalDate.of ( 2016 , 4 , 29 );
YearQuarter yearQuarter = YearQuarter.from ( localDate );

然后询问YearQuarter对象的开始日期。

LocalDate quarterStart = yearQuarter.atDay ( 1 );

ChronoUnit

ChronoUnit枚举可以计算如上所示的经过时间。

或者,Period类。

Period

Period类代表以年,月和日为单位的时间跨度。

计算季度开始到目标日期之间的时间跨度。

Period period = Period.between ( quarterStart , localDate );

提取该时间段内的总天数。

int days = ( period.getDays () + 1 );  // Add one to get the ordinal.

半开

请注意,此结果为28,而不是您期望的29。这是因为在日期时间工作中,我们通常使用“半开”方法来定义开头包含的时间跨度,而结尾是独占。这通常更明智和有益。如果您在所有日期工作中练习,也可以使您的编码更容易理解,更容易理解。因此,一周从星期一开始运行,但不包括下周一。您的午休时间从中午的第一个时刻开始,一直持续到但不包括下午1点的第一时刻。

所以,这里从4月1日到29日是28天。我建议坚持使用,但如果需要,你当然可以添加一个。

转储到控制台。

System.out.println ( "localDate: " + localDate + " is days: " + days + " into yearQuarter: " + yearQuarter );
  

localDate:2016-04-29是几天:28年到四年:2016年第二季度

有关详细讨论,请参阅my Answer to a similar Question