我需要比较java中的两个日期。我正在使用这样的代码:
Date questionDate = question.getStartDate();
Date today = new Date();
if(today.equals(questionDate)){
System.out.println("Both are equals");
}
这不起作用。变量的内容如下:
questionDate
包含2010-06-30 00:31:40.0
today
包含Wed Jun 30 01:41:25 IST 2010
我该如何解决这个问题?
答案 0 :(得分:42)
日期相等性取决于两个日期等于毫秒。使用new Date()
创建新的Date对象永远不会等于过去创建的日期。 Joda Time的API简化了日期工作;但是,仅使用Java的SDK:
if (removeTime(questionDate).equals(removeTime(today))
...
public Date removeTime(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
return cal.getTime();
}
答案 1 :(得分:13)
我会使用JodaTime。这是一个例子 - 假设您想要找出两个日期之间的天数差异。
DateTime startDate = new DateTime(some_date);
DateTime endDate = new DateTime(); //current date
Days diff = Days.daysBetween(startDate, endDate);
System.out.println(diff.getDays());
JodaTime可以从here下载。
答案 2 :(得分:10)
我不清楚你想要什么,但我会提到Date类也有一个compareTo方法,如果两个Date对象相等,可以用一个调用来确定或者(如果它们不相等)更快发生。这允许您执行以下操作:
switch (today.compareTo(questionDate)) {
case -1: System.out.println("today is sooner than questionDate"); break;
case 0: System.out.println("today and questionDate are equal"); break;
case 1: System.out.println("today is later than questionDate"); break;
default: System.out.println("Invalid results from date comparison"); break;
}
应该注意的是,API文档不保证结果为-1,0和1,因此您可能希望在任何生产代码中使用if-elses而不是switch。此外,如果第二个日期为null,您将获得NullPointerException,因此将代码包装在try-catch中可能很有用。
答案 3 :(得分:5)
比较两个日期的最简单方法是将它们转换为数值(如unix时间戳)。
您可以使用 Date.getTime()
方法返回unix时间。
Date questionDate = question.getStartDate();
Date today = new Date();
if((today.getTime() == questionDate.getTime())) {
System.out.println("Both are equals");
}
答案 4 :(得分:3)
使用time.compareTo(currentTime) < 0
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class MyTimerTask {
static Timer singleTask = new Timer();
@SuppressWarnings("deprecation")
public static void main(String args[]) {
// set download schedule time
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 9);
calendar.set(Calendar.MINUTE, 54);
calendar.set(Calendar.SECOND, 0);
Date time = (Date) calendar.getTime();
// get current time
Date currentTime = new Date();
// if current time> time schedule set for next day
if (time.compareTo(currentTime) < 0) {
time.setDate(time.getDate() + 1);
} else {
// do nothing
}
singleTask.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("timer task is runing");
}
}, time);
}
}
答案 5 :(得分:3)
在Java 8中,不需要使用Joda-Time,因为它在java.time
包中附带了类似的新API。使用LocalDate
类。
LocalDate date = LocalDate.of(2014, 3, 18);
LocalDate today = LocalDate.now();
Boolean isToday = date.isEqual( today );
您可以询问Period
课程日期之间的时间跨度。
Period difference = Period.between(date, today);
使用equals
和compareTo
LocalDate
具有可比性,因为它不包含有关时间和时区的信息。
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和&amp; SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。
答案 6 :(得分:1)
如果两个Calendar变量在一年中的同一天,则以下内容将返回true。
public boolean isSameDay(Calendar c1, Calendar c2){
final int DAY=1000*60*60*24;
return ((c1.getTimeInMillis()/DAY)==(c2.getTimeInMillis()/DAY));
} // end isSameDay
答案 7 :(得分:0)
这是另一个答案: 您需要格式化拖曳日期以适合相同的fromat,以便能够将它们作为字符串进行比较。
Date questionDate = question.getStartDate();
Date today = new Date();
SimpleDateFormat dateFormatter = new SimpleDateFormat ("yyyy/MM/dd");
String questionDateStr = dateFormatter.format(questionDate);
String todayStr = dateFormatter.format(today);
if(questionDateStr.equals(todayStr)) {
System.out.println("Both are equals");
}
答案 8 :(得分:0)
public static double periodOfTimeInMillis(Date date1, Date date2) {
return (date2.getTime() - date1.getTime());
}
public static double periodOfTimeInSec(Date date1, Date date2) {
return (date2.getTime() - date1.getTime()) / 1000;
}
public static double periodOfTimeInMin(Date date1, Date date2) {
return (date2.getTime() - date1.getTime()) / (60 * 1000);
}
public static double periodOfTimeInHours(Date date1, Date date2) {
return (date2.getTime() - date1.getTime()) / (60 * 60 * 1000);
}
public static double periodOfTimeInDays(Date date1, Date date2) {
return (date2.getTime() - date1.getTime()) / (24 * 60 * 60 * 1000L);
}
答案 9 :(得分:0)
public long compareDates(Date exp, Date today){
long b = (exp.getTime()-86400000)/86400000;
long c = (today.getTime()-86400000)/86400000;
return b-c;
}
这适用于GregorianDates.
86400000是一天中的毫秒数,这将返回两个日期之间的天数。
答案 10 :(得分:0)
这是一篇非常古老的帖子,虽然分享我的作品。这是一个小技巧
DateTime dtStart = new DateTime(Dateforcomparision);
DateTime dtNow = new DateTime(); //current date
if(dtStart.getMillis() <= dtNow.getMillis())
{
//to do
}
根据您的要求使用比较器
答案 11 :(得分:0)
{{1}}
它有效!
答案 12 :(得分:0)
效果最佳....
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);
答案 13 :(得分:-1)
以下是你可以做的yyyy-mm-dd比较:
GregorianCalendar gc= new GregorianCalendar();
gc.setTimeInMillis(System.currentTimeMillis());
gc.roll(GregorianCalendar.DAY_OF_MONTH, true);
Date d1 = new Date();
Date d2 = gc.getTime();
SimpleDateFormat sf= new SimpleDateFormat("yyyy-MM-dd");
if(sf.format(d2).hashCode() < sf.format(d1).hashCode())
{
System.out.println("date 2 is less than date 1");
}
else
{
System.out.println("date 2 is equal or greater than date 1");
}