在java中,如何确定日期是否比今天的日期早1年
在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
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,或者是否要将日历的时/分/秒部分归零