我正在尝试与日期对象进行比较。只有一个问题是我想比较几天,几个月和几年。
/* toString output
mydate 2013-08-23
current date: Thu Aug 23 14:15:34 CEST 2013
如果我比较几天(23-08-2013)日期是相等的,如果我正在使用.after()。before()方法 日期不同。
是否有简单比较日,月,年的Java方法或者我必须比较每个值?
答案 0 :(得分:18)
Calendar cal1 = Calendar.getInstance();
Calendar cal2 = Calendar.getInstance();
cal1.setTime(date1);
cal2.setTime(date2);
boolean sameDay = cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR) &&
cal1.get(Calendar.DAY_OF_YEAR) == cal2.get(Calendar.DAY_OF_YEAR);
这将完美地工作.........
答案 1 :(得分:4)
如果您不想使用外部库并且使用Calendar没有问题,您可以尝试这样的事情:
Calendar calendar1= Calendar.getInstance();
Calendar calendar2= Calendar.getInstance();
Date date1 = ...;
Date date2= ...;
calendar1.setTime(date1);
calendar1.set(Calendar.HOUR_OF_DAY, 0);
calendar1.set(Calendar.MINUTE, 0);
calendar1.set(Calendar.SECOND, 0);
calendar1.set(Calendar.MILLISECOND, 0);
calendar2.setTime(date2);
calendar2.set(Calendar.HOUR_OF_DAY, 0);
calendar2.set(Calendar.MINUTE, 0);
calendar2.set(Calendar.SECOND, 0);
calendar2.set(Calendar.MILLISECOND, 0);
calendar1.after(calendar2);
calendar1.before(calendar2);
不是那么简单但是......
答案 2 :(得分:3)
不幸的是,核心Java API中的日期支持非常弱。您可以使用Calendar
从日期中删除时间/时区信息。你可能想要写一个单独的方法来做到这一点。你也可以使用Joda API来支持日期/时间,因为它比Java更好。
答案 3 :(得分:3)
Joda-Time更好,强烈推荐。但是如果你必须使用Java api,你可以这样做 -
Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();
c1.setTime(someDate);
c2.setTime(someOtherDate);
int yearDiff = c1.get(Calendar.YEAR) - c2.get(Calendar.YEAR);
int monthDiff = c1.get(Calendar.MONTH) - c2.get(Calendar.MONTH);
int dayDiff = c1.get(Calendar.DAY_OF_MONTH) - c2.get(Calendar.DAY_OF_MONTH);
比如只比较一年,你可以做 -
if(c1.get(Calendar.YEAR) > c2.get(Calendar.YEAR)){
// code
}
等
答案 4 :(得分:2)
Date date = new Date();
String str="2013-08-23";
Date date=new SimpleDateFormat("yyyy-MM-dd").parse(str);
Calendar cal = Calendar.getInstance();
cal.setTime(date);
Calendar cal1 = Calendar.getInstance();
cal1.setTime(date1);
if(cal.get(Calendar.YEAR) == cal1.get(Calendar.YEAR)){
System.out.println("Years are equal");
}
else{
System.out.println("Years not equal");
}
if(cal.get(Calendar.MONTH) == cal1.get(Calendar.MONTH)){
System.out.println("Months are equal");
}
else{
System.out.println("Months not equal");
}
答案 5 :(得分:1)
JDK中没有任何内容。您可以使用一些外部库作为Apache Commons Lang。有一种方法DateUtils.isSameDay(Date, Date)
可以满足您的需求。
最好避免使用Java的Date
并使用例如JodaTime。
答案 6 :(得分:1)
我想比较几天,几个月和几年。
mydate 2013-08-23
当前日期:8月23日星期四14:15:34 CEST 2013
如果您想动态捕捉当前日期。
LocalDate.now( // Capture the current date…
ZoneId.of( "Europe/Paris" ) // …as seen by the wall-clock time used by the people of a particular region (a time zone).
)
.isEqual(
LocalDate.parse( "2013-08-23" )
)
或者,特定时刻。
ZonedDateTime.of( // Thu Aug 23 14:15:34 CEST 2013
2013 , 8 , 23 , 14 , 15 , 34 , 0 , ZoneId.of( "Europe/Paris" )
)
.toLocalDate() // Extract the date only, leaving behind the time-of-day and the time zone.
.isEqual(
LocalDate.parse( "2013-08-23" )
)
LocalDate
捆绑的java.util.Date和.Calendar类非常麻烦。避免他们。正如其他答案所建议的那样,使用一个体面的日期时间库。这意味着:
您需要从日期时间中提取仅限日期的值,以忽略时间。 Joda-Time和java.time都有这样一个类,巧合地命名为LocalDate
。
Java 8及更高版本中内置的java.time框架取代了旧的java.util.Date/.Calendar类。新课程的灵感来自非常成功的Joda-Time框架,旨在作为其继承者,在概念上类似但重新设计。由JSR 310定义。由ThreeTen-Extra项目扩展。请参阅Tutorial。
ZoneId zoneId = ZoneId.of( "Europe/Paris" );
ZonedDateTime x = ZonedDateTime.of( 2014, 1, 2, 3, 4, 5, 6, zoneId );
ZonedDateTime y = ZonedDateTime.now( zoneId );
通过调用toLocalDate
提取并比较日期时间的仅限日期部分。
Boolean isSameDate = x.toLocalDate().isEqual( y.toLocalDate() );
DateTimeZone timeZoneParis = DateTimeZone.forID( "Europe/Paris" );
DateTime x = new DateTime( 2014, 1, 2, 3, 4, 5, 6, timeZoneParis );
DateTime y = new DateTime( 2014, 6, 5, 4, 3, 2, 1, timeZoneParis );
boolean isXAfterY = x.isAfter( y );
要测试日期部分的相等性,请将DateTime对象转换为LocalDate
,该dayOfMonth仅描述没有任何时间或时区的日期(用于确定日期的时区除外)。
boolean isSameDate = x.toLocalDate().isEqual( y.toLocalDate() );
如果你想检查组成元素,Joda-Time提供的方法包括{{3}},hourOfDay等。
答案 7 :(得分:0)
这样怎么样
String str="2013-08-23";
Date date=new SimpleDateFormat("yyyy-MM-dd").parse(str);
Calendar cal=Calendar.getInstance();
cal.setTime(date);
Calendar calNow=Calendar.getInstance();
if(cal.get(Calendar.YEAR)>calNow.get(Calendar.YEAR)){
// do something
}if(cal.get(Calendar.MONTH)>calNow.get(Calendar.MONTH)){
// do something
}if(cal.get(Calendar.DATE)>calNow.get(Calendar.DATE)){
// do something
}
答案 8 :(得分:0)
你可以试试这个
Date d1= ...
Date d2= ...
long dayInMillis = 24 * 3600 * 1000;
boolean dateEqual = d1.getTime() / dayInMillis == d2.getTime() / dayInMillis;
答案 9 :(得分:0)
这个问题的解决方案非常简单。您需要首先将日期时间字符串解析为Java API中的Date时刻(您可以使用SimpleDateFormat对象来帮助您执行此操作)。
如果您有两个时间表示为日期:
的Presto!
将Date对象调整为本地时间并将其作为POSIX Epoch中的十进制天数返回的方法如下:
public static double toLocalDayNumber(Date d, GregorianCalendar gc) {
gc.setTime(d);
long utcDateAsMillisFromEpoch = gc.getTimeInMillis();
long localDateAsMillisFromEpoch = utcDateAsMillisFromEpoch +
gc.get(GregorianCalendar.ZONE_OFFSET) +
gc.get(GregorianCalendar.DST_OFFSET);
return (((double) localDateAsMillisFromEpoch) / (86400.0 * 1000.0);
}
此方法采用Date对象d
和使用感兴趣的本地TimeZone构造的Java API Calendar对象gc
。
答案 10 :(得分:0)
仅使用Date
SimpleDateFormat cDate1 = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
Date now1 = new Date();
String ccDate1 = cDate1.format(now1);
System.out.println("Date1=="+ccDate1);
SimpleDateFormat cDate2 = new SimpleDateFormat("yyyy-MM-dd HH-mm-sss");
Date now2 = new Date();
String ccDate2 = cDate2.format(now2);
System.out.println("Date2=="+ccDate2);
if(ccDate1.equals(ccDate2))//Get full feature of date
System.out.println("Equal");
else
System.out.println("Not Equal");
if(ccDate1.split(" ")[0].equals(ccDate2.split(" ")[0]))//Comparing Full Date
System.out.println("Equal");
else
System.out.println("Not Equal");
if(ccDate1.split(" ")[0].split("-")[0].equals(ccDate2.split(" ")[0].split("-")[0]))//Comparing YEAR
System.out.println("Equal");
else
System.out.println("Not Equal");
if(ccDate1.split(" ")[0].split("-")[1].equals(ccDate2.split(" ")[0].split("-")[1]))//Comparing MONTH
System.out.println("Equal");
else
System.out.println("Not Equal");
if(ccDate1.split(" ")[0].split("-")[2].equals(ccDate2.split(" ")[0].split("-")[2]))//Comparing DAY
System.out.println("Equal");
else
System.out.println("Not Equal");
答案 11 :(得分:0)
使用Java日历仅比较2个日历对象之间的日期部分而不必清除()调用Calendar.getInstance()时设置的所有其他日历字段(MINUTE,MILLISECOND等)的示例。
我知道此线程很旧,这不是一个新的解决方案,但可能对某些人有帮助。
Calendar cal1 = Calendar.getInstance();
Calendar cal2 = Calendar.getInstance();
cal1.set(2018, Calendar.JANUARY, 1);
cal2.set(2018, Calendar.JANUARY, 1);
System.out.println(_doesCalendar1DateMatchCalendar2Date(cal1,cal2)); // in this case returns true
private boolean _doesCalendar1DateMatchCalendar2Date(Calendar cal1, Calendar cal2) {
boolean sameDate = cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR)
&& cal1.get(Calendar.MONTH) == cal2.get(Calendar.MONTH)
&& cal1.get(Calendar.DATE) == cal2.get(Calendar.DATE);
return sameDate;
}