我需要获得四分之一的统计数据。
示例:今天是2018年2月10日 th ,我需要检索2017年12月的数据,从1 st 到31 st ,然后从2018年1月起,从1 st 到30 th 和从2月1日 st 到当前日期。
如何使用Java Date
实现此目的?
答案 0 :(得分:2)
YearMonth.now().minusMonths( 1 ).atEndOfMonth() // or .atDay( 1 )
获取今天的约会。
ZoneId z = ZoneId.of( “Africa/Tunis” ) ;
LocalDate today = LocalDate.now( z ) ;
获取该日期的year-month。
YearMonth ymCurrent = YearMonth.from( today ) ;
将ThreeTen-Extra库添加到项目中以访问LocalDateRange
类。对于从一个日期到另一个日期的日期范围,此类将一对LocalDate
个对象(开始日期和停止日期)表示为一个对象。
LocalDateRange rangeCurrent = LocalDateRange.ofClosed( ymCurrent.atDay( 1 ) , today ) ;
移至上个月。
YearMonth ymPrevious = ymCurrent.minusMonths( 1 ) ;
LocalDateRange rangePrevious = LocalDateRange.ofClosed( ymPrevious.atDay( 1 ) , ymPrevious.atEndOfMonth() ) ;
再减去你第三个月的时间。
提示:考虑使用半开放式方法来定义时间跨度,其中开头是包含,而结尾是独占。因此,一个月从本月的第一天开始,一直持续到下个月的第一天,但不包括在内。
对于使用 java.time 类的另一种有效方法,请参阅the Answer by diston。
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*
类。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。
答案 1 :(得分:1)
尝试这样的事情:
// Get current date
Calendar start;
start = Calendar.getInstance();
// Go to beginning of month
start.set(Calendar.DAY_OF_MONTH, 1);
start.set(Calendar.HOUR_OF_DAY, 0);
start.set(Calendar.MINUTE, 0);
start.set(Calendar.SECOND, 0);
start.set(Calendar.MILLISECOND, 0);
// Go 2 months back
my_date.add(Calendar.MONTH, -2);
// Get end of same month
Calendar end;
end = start.clone();
end.add(Calendar.MONTH, 1);
end.add(Calendar.DAY_OF_MONTH, -1);
然后,为其他月份做类似的事情
答案 2 :(得分:1)
您可以使用Java 8's java.time类(或threeten backport用于Java< = 7)。
如果您只使用日/月/年并且不关心小时和时区,那么最好使用的课程是LocalDate
。要创建特定日期很简单:
// February 10th 2018
LocalDate current = LocalDate.of(2018, 2, 10);
或者您可以致电LocalDate.now()
获取当前日期。
然后,要到2017年12月1日 st ,您必须减去2个月(2月份是12月之前的2个月)并将日期设置为1:
// start is December 1st 2017
LocalDate start = current
// 2 months ago = December
.minusMonths(2)
// change day of month to 1st
.withDayOfMonth(1);
然后你可以从12月1日 st 循环到2月10日 th :
LocalDate date = start;
while (date.isBefore(current)) {
// do whatever you need with the date
// go to the next day
date = date.plusDays(1);
}
请注意plusDays
会返回一个新对象,因此我必须将其分配给同一个变量,否则无法更改。
我还使用了isBefore
,它没有在循环中包含当前日期 - 它将在2月9日 th 停止。如果要包含2月10日 th ,请将条件更改为if (! date.isAfter(current))