如何确定6个月前的日期

时间:2012-02-27 06:22:38

标签: java date

我需要确定6个月前的日期。例如:

Feb-27, 2012(Today) - It is Feb and we don't count incomplete month, false
Feb-01, 2012 - Still Feb so don't count too, false
Jan-01, 2011 - Completed, false
Dec-01, 2011 - Completed, false
Nov-01, 2011 - Completed, false
Oct-01, 2011 - Completed, false
Sep-01, 2011 - Completed, false
Aug-01, 2011 - Completed, false
Jul-01, 2011 - Already pass 6 complete months, true

它应该在将来的任何日期工作。

我想到当前日期减去30 * 6 = 180天,但它不准确。

它必须准确,因为,例如,如果我们确定2011年7月有效,那么我们将保存该月的所有数据

感谢。

5 个答案:

答案 0 :(得分:19)

我会尝试这个简单的逻辑来完成这项工作。

Calendar cal = Calendar.getInstance();  //Get current date/month i.e 27 Feb, 2012
cal.add(Calendar.MONTH, -6);   //Go to date, 6 months ago 27 July, 2011
cal.set(Calendar.DAY_OF_MONTH, 1); //set date, to make it 1 July, 2011

希望这有帮助。

答案 1 :(得分:7)

如果你可以使用JodaTime,这里的代码是±6个月的计算:

    import org.joda.time.DateTime;
    import org.joda.time.Months;
    ....
    ....
    DateTime now = new DateTime();
    DateTime then = new DateTime().withDate(2011, 8, 1);
    if(Math.abs(Months.monthsBetween(now, then).getMonths()) > 6){
        System.out.println("6 mo apart!");
        //your logic goes here
    }

答案 2 :(得分:2)

使用joda-time等库来满足您的时间和日期需求。我认为你可以这样做:

new LocalDate()minusMonths(7)withDayOfMonth(1)

(7个月来支付任何部分月份......留下了本月第一天的优势......但是......)

答案 3 :(得分:1)

YearMonth

Java内置的java.time.YearMonth类使这项任务变得简单。

获取当前年度月份。这需要一个时区,因为在任何特定时刻,日期在全球范围内按区域变化。在该月的第一天/最后一天,该地区可能因地区而异。

YearMonth ymCurrent = YearMonth.now( ZoneId.of( "America/Montreal" )  );

根据定义,我们知道当前月份不完整。所以搬到上个月。

YearMonth ymPrevious = ymCurrent.minusMonths( 1 ) ;

如果需要,可以提前六个月再搬家。

YearMonth ymSixMonthsMore = ymPrevious.minusMonths( 6 );

YearMonth对象本身在您的代码中可能很有用。您可以在代码中传递此类的这些对象。

如果您需要一个月的第一天,请询问。

LocalDate ld = ymSixMonthsMore.atDay( 1 );

答案 4 :(得分:0)

据我了解,您需要有一个实用程序,用于确定变量日期是否在您设置的参考日期之前6个月。看看我的代码片段来解决这个问题。只需使用java.util.Calendar,您就不必使用其他库。

import java.util.Calendar;

public class Test
{
    public static void main(String[] args)
    {
        Calendar cal1 = Calendar.getInstance();
        cal1.set(2012, 2, 27);
        Calendar cal2 = Calendar.getInstance();
        cal2.set(2011, 8, 1);
        boolean valid = isSixMonthsAgo(cal1, cal2);
        System.out.println(valid);
    }

    public static boolean isSixMonthsAgo(Calendar referenceDate, Calendar dateToBeTested) 
    {
        int year1 = referenceDate.get(Calendar.YEAR);
        int month1 = referenceDate.get(Calendar.MONTH);

        int year2 = dateToBeTested.get(Calendar.YEAR);
        int month2 = dateToBeTested.get(Calendar.MONTH);

        if ((year1 * 12 + month1) - (year2 * 12 + month2) > 6)
            return true;
        return false;
    }
}