[英]Compare two dates in Java
我需要比较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
我该如何解决这个问题?
日期相等性取决于两个日期等于毫秒。 使用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();
}
我会用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可以从这里下载。
我不清楚你想要什么,但我会提到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中可能很有用。
比较两个日期的最简单方法是将它们转换为数值(如unix时间戳)。
您可以使用返回unix时间的Date.getTime()
方法。
Date questionDate = question.getStartDate();
Date today = new Date();
if((today.getTime() == questionDate.getTime())) {
System.out.println("Both are equals");
}
它是esy使用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);
}
}
在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);
LocalDate
可以使用equals
和compareTo
比较,因为它不包含有关时间和时区的信息。
java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧遗留日期时间类,如java.util.Date
, Calendar
和SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的类,比如Interval
, YearWeek
, YearQuarter
,和更多 。
如果两个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
这是另一个答案:您需要格式化两个日期以适应相同的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");
}
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);
}
public long compareDates(Date exp, Date today){
long b = (exp.getTime()-86400000)/86400000;
long c = (today.getTime()-86400000)/86400000;
return b-c;
}
这适用于GregorianDates.
86400000是一天中的毫秒数,这将返回两个日期之间的天数。
这是一篇非常古老的帖子,虽然分享我的作品。 这是一个小技巧
DateTime dtStart = new DateTime(Dateforcomparision);
DateTime dtNow = new DateTime(); //current date
if(dtStart.getMillis() <= dtNow.getMillis())
{
//to do
}
根据您的要求使用比较器
在我的情况下,我只需要做这样的事情:
date1.toString().equals(date2.toString())
它奏效了!
它效果最好......
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);
以下是你可以做的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");
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.