在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
}
}
答案 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;
}