Java当前日期减去3个月并从月初开始

时间:2018-03-13 12:56:18

标签: java date date-manipulation

我需要获得四分之一的统计数据。

示例:今天是2018年2月10日 th ,我需要检索2017年12月的数据,从1 st 到31 st ,然后从2018年1月起,从1 st 到30 th 和从2月1日 st 到当前日期。

如何使用Java Date实现此目的?

3 个答案:

答案 0 :(得分:2)

TL;博士

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.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance 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的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 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))