我如何实施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);
答案 0 :(得分:1)
您是否尝试过使用joda time?
Java SE 8之前的标准日期和时间类别很差。通过正面解决这个问题,Joda-Time成为Java SE 8之前Java事实上的标准日期和时间库。
然后您可以计算两个日期之间的天数
使用类似于以下的技术: 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)
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 8及更高版本中内置的java.time框架(带有Java 6&amp; 8和Android的后端),如Answer by Andreas所示。
此外,您可以添加扩展java.time的ThreeTen-Extra库以提供额外的功能,其中一些最终可能会添加到java.time中。要使用此库,请将其jar文件添加到项目中(或使用Maven等)。
Quarter
&amp; YearQuarter
ThreeTen-Extra库包含您可能觉得特别有用的Quarter
和YearQuarter
类。更安全的是在代码中传递这些类型的对象,而不是使用字符串和数字来表示您的宿舍。
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。