Как определить дату 6 полных месяцев назад - PullRequest
8 голосов
/ 27 февраля 2012

Мне нужно определить дату, которая 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 года действителен, то мы будем хранить все данные за этот месяц .

Спасибо.

Ответы [ 5 ]

19 голосов
/ 27 февраля 2012

Я бы попробовал эту простую логику, чтобы сделать работу.

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

Надеюсь, это поможет.

7 голосов
/ 27 февраля 2012

Если вы могли бы использовать 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 голосов
/ 27 февраля 2012

Используйте библиотеку, например joda-time , для ваших потребностей в времени и дате Я думаю, вы могли бы сделать это с помощью:

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

(7 месяцев, чтобы покрыть любые неполные месяцы ... оставляет крайний случай первого месяца ... но да :))

1 голос
/ 22 октября 2016

YearMonth

Класс java.time.YearMonth, встроенный в Java, упрощает эту задачу.

Получите текущий год-месяц.Для этого требуется часовой пояс, так как в любой момент времени дата меняется по всему земному шару в зависимости от зоны.В первый / последний день месяца месяц может меняться по всему миру в зависимости от зоны.

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

Мы знаем, что текущий месяц является неполным по определению.Итак, перейдите к предыдущему месяцу.

YearMonth ymPrevious = ymCurrent.minusMonths( 1 ) ;

Переместите на шесть месяцев раньше, если хотите.

YearMonth ymSixMonthsMore = ymPrevious.minusMonths( 6 );

Этот объект YearMonth сам по себе может быть полезен в вашем коде.Вы можете вставить эти объекты этого класса в ваш код.

Если вам нужен первый день месяца, спросите.

LocalDate ld = ymSixMonthsMore.atDay( 1 );
0 голосов
/ 27 февраля 2012

Как я понимаю, вам нужна утилита, которая будет определять , является ли переменная дата за 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...