Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中,如何确定日期是否比今天的日期早1年_Java_Date - Fatal编程技术网

在java中,如何确定日期是否比今天的日期早1年

在java中,如何确定日期是否比今天的日期早1年,java,date,Java,Date,在java中,如何确定特定日期是否在今天日期的1年内 我有以下几点,但不确定这是否是最好的方法 String date = "01/19/2005"; DateFormat df = new SimpleDateFormat("dd/MM/yyyy"); Date lastExamTakenDate = null; Calendar todaysDateMinus1Year = Calendar.getInstance(); todaysDateMinus

在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
        }

    }

如果在日期对象上调用getTime,它将返回一个从1月1日起以毫秒为单位的long。1970检查一个日期是否在上一年之内是一件简单的事情,用一年前的日期创建一个日期对象,并对长值someDate>aYearAgo进行比较。或者,您可以对日历对象使用after方法。要使用一年前的值创建calendar/date对象,可以使用calObj.addCalendar.year,-1。

我相信这样做可以让您知道日历日的开始,因此一天中的时间不是一个因素

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

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

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;
}
您使用GregoriaCalendar的解决方案在技术上更为正确。

这非常适合

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

}

与java捆绑的java.util.Date和.Calendar类是出了名的麻烦。请避免使用它们。使用java 8捆绑的、受Joda time启发的新java.time包

乔达时间 如果确定只希望date不带时间或时区,请使用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 );
当运行时

投入:01/19/2005 本地日期:2005-01-19 现在:2014-04-10 一年前:2013-04-10 一年前:错

你可能想添加一个测试,或者取决于你在去年内的定义。

这是有效的,对吗?有两件事我会从代码结构VIEWPT中改变:首先,把日期解析在顶部附近,如果你不能解析,不要创建日历;第二,考虑你是否想要一年那么精确。21 2008美国东部时间下午5:13,或者是否要将日历的时/分/秒部分归零