Как узнать, является ли дата за 1 год до сегодняшней даты в Java - PullRequest
2 голосов
/ 22 мая 2009

В Java, как я могу узнать, находится ли конкретная дата в течение 1 года от сегодняшней даты.

У меня есть следующее, но я не уверен, что это лучший подход.

    String date = "01/19/2005";
    DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
    Date lastExamTakenDate = null;
    Calendar todaysDateMinus1Year = Calendar.getInstance();
    todaysDateMinus1Year.add(Calendar.YEAR, -1);

    if (date!=null)
    {
        try {
             lastExamTakenDate = df.parse(date);
            if (lastExamTakenDate.before(todaysDateMinus1Year.getTime()))
                hasToTakeExam = true;
        } catch (ParseException ex) {
            //exception
        }

    }

Ответы [ 5 ]

2 голосов
/ 10 апреля 2014

Классы java.util.Date & .Calendar, связанные с Java, общеизвестно проблематичны. Избежать их. Используйте Joda-Time или новый пакет java.time в комплекте с Java 8 (и вдохновленный Joda-Time).

Joda-Time

Если вы уверены, что вам нужна дата только без часового пояса или часового пояса, используйте класс LocalDate (находится в Joda-Time и java.time).

Обратите внимание на использование часового пояса при запросе текущей даты. Дата варьируется в зависимости от того, где вы находитесь на земле в данный момент. Если вы не укажете дату, будет использован часовой пояс JVM по умолчанию. Вообще лучше уточнить.

Вот пример кода с использованием Joda-Time 2.3.

String input = "01/19/2005";
DateTimeFormatter formatter = DateTimeFormat.forPattern( "MM/dd/yyyy" );
LocalDate localDate = LocalDate.parse( input, formatter );
DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
LocalDate now = LocalDate.now( timeZone );
LocalDate yearAgo = now.minusYears( 1 );
boolean withinYearAgo = ( ( localDate.isAfter( yearAgo ) ) & ( localDate.isBefore( now ) ) );

Дамп на консоль ...

System.out.println( "input: " + input );
System.out.println( "localDate: " + localDate );
System.out.println( "now: " + now );
System.out.println( "yearAgo: " + yearAgo );
System.out.println( "withinYearAgo: " + withinYearAgo );

При запуске ...

input: 01/19/2005
localDate: 2005-01-19
now: 2014-04-10
yearAgo: 2013-04-10
withinYearAgo: false

Возможно, вы захотите добавить тест для «или равно» в зависимости от вашего определения «в течение прошлого года».

1 голос
/ 22 мая 2009

Я полагаю, что что-то подобное даст вам начало календарного дня, поэтому время суток не имеет значения.

GregorianCalendar calToday = new GregorianCalendar();
GregorianCalendar oneYearAgoTodayAtMidnight = new GregorianCalendar(calToday.get(Calendar.YEAR) - 1, calToday.get(Calendar.MONTH), calToday.get(Calendar.DATE));
1 голос
/ 22 мая 2009

Этот подход игнорирует високосные годы (и другие странности, связанные с календарем), но очень прост:

public boolean isWithinAYear(Date inputDate) {
  Date d = new Date() // Get "now".
  long dLong = d.getTime();
  // You could multiply this next line out and use a single constant,
  // I didn't do that for clarity (and the compiler will optimize it 
  // out for us anyhow.)
  long oneYearAgo = dLong - (365 * 24 * 60 * 60 * 1000); 

  return inputDate.getTime() > oneYearAgo;
}

Ваше решение с использованием GregorianCalendar технически более правильно.

1 голос
/ 22 мая 2009

Если вы вызовете getTime () для объекта даты, он вернет длинную с миллисекундами с эпохи (январь 1. 1970). Проверка того, находится ли дата в прошлом году, - это просто вопрос создания одного объекта даты с датой год назад и сравнения длинных значений (someDate> aYearAgo). В качестве альтернативы вы можете использовать метод after () для объекта календаря. Чтобы создать объект календаря / даты со значением год назад, вы можете использовать calObj.add (Calendar.YEAR, -1).

0 голосов
/ 10 апреля 2014

Это прекрасно работает.

публичный класс X {

 public static Date date ;

public static Date date1 ;


/**
 * @param args the command line arguments
 */
public static void main(String[] args) {

   Calendar cal = Calendar.getInstance();
 cal.add(Calendar.YEAR, 0); 

    boolean time;

 date = cal.getTime();
    System.out.println(date);
 time =  withinYear(date);

   System.out.println(time);

}


private static boolean result;
public static  boolean withinYear(Date inputDate)
{
   Calendar todaysDateMinus1Year = Calendar.getInstance();
todaysDateMinus1Year.add(Calendar.YEAR, -1);


date1 = todaysDateMinus1Year.getTime();

if (inputDate.before(date1))
            result= true;
            return result;

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...