如何在今天的日期之前查明日期是否为1年

时间:2009-05-21 20:59:38

标签: java date

在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 个答案:

答案 0 :(得分:2)

java.util.Date&与Java捆绑在一起的.Calendar类非常麻烦。避免他们。使用Joda-Time或与Java 8捆绑在一起的新java.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 :(得分:1)

如果你在日期对象上调用getTime(),它将返回一个长度,自纪元(jan 1. 1970)以来毫秒。检查日期是否在去年之内是一个简单的问题,即创建一个具有一年前日期的日期对象并对长值进行比较(someDate> aYearAgo)。或者,您可以在日历对象上使用after()方法。要使用一年前的值创建日历/日期对象,可以使用calObj.add(Calendar.YEAR,-1)。

答案 2 :(得分:1)

我相信这样的事情会让你在日历日开始,所以时间不是一个因素。

GregorianCalendar calToday = new GregorianCalendar();
GregorianCalendar oneYearAgoTodayAtMidnight = new GregorianCalendar(calToday.get(Calendar.YEAR) - 1, calToday.get(Calendar.MONTH), calToday.get(Calendar.DATE));

答案 3 :(得分:1)

这种方法忽略了闰年(和其他由日历引起的奇怪现象),但非常简单:

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的解决方案在技术上更正确。

答案 4 :(得分:0)

这非常适合。

公共类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;

}