我正在尝试与日期对象进行比较。只有一个问题是我只想比较天、月和年。
/* toString output
mydate 2013-08-23
current date: Thu Aug 23 14:15:34 CEST 2013
如果我只比较天( 23-08-2013 )日期是相等的,如果我使用 .after() .before() 方法日期是不同的。
是否有 Java 方法可以简单地比较天、月、年,还是我必须比较每个值?
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);
这将完美地工作......
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
}
等等
如果您不想使用外部库并且使用日历没有问题,您可以尝试以下操作:
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);
不是那么简单,而是……
不幸的是,核心 Java API 中的日期支持非常薄弱。您可以使用Calendar
从日期中删除时间/时区信息。您可能想编写一个单独的方法来做到这一点。您还可以使用 Joda API 来支持日期/时间,因为它比 Java 的要好得多。
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");
}
我只想比较天、月和年。
我的日期 2013-08-23
当前日期:2013 年 8 月 23 日星期四 14:15:34 CEST
如果要动态捕获当前日期。
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项目扩展。请参阅教程。
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
仅描述没有任何时间或时区(用于决定日期的时区除外)的日期。
boolean isSameDate = x.toLocalDate().isEqual( y.toLocalDate() );
如果要检查组成元素,Joda-Time 提供了dayOfMonth、 hourOfDay 等方法。
不,JDK中没有任何内容。您可以使用一些外部库作为Apache Commons Lang。有一种方法DateUtils.isSameDay(Date, Date)
可以满足您的需求。
最好避免使用Date
Java 并使用例如JodaTime。
这种方式怎么样
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
}
你可以试试这个
Date d1= ...
Date d2= ...
long dayInMillis = 24 * 3600 * 1000;
boolean dateEqual = d1.getTime() / dayInMillis == d2.getTime() / dayInMillis;
这个问题的解决方案非常简单。您需要首先将日期时间字符串解析为 Java API 中的 Date 瞬间(您可以使用 SimpleDateFormat 对象来帮助您完成此操作)。
如果您有两个表示为日期的时间瞬间:
快!
将 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
和一个gc
使用本地 TimeZone 构建的 Java API Calendar 对象。
通过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");
一个使用 Java Calendar 仅比较 2 个日历对象之间的日期部分而无需 clear() 所有其他日历字段(MINUTE、MILLISECOND 等)的示例,这些字段在调用 Calendar.getInstance() 时设置。
我知道这个线程很旧,这不是一个新的解决方案,但可能对某些人有帮助。
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;
}