Java 检查我的日历日期参数是否为当前日期
我只想找到date参数是当前日期(yyyy-MM-dd),而不使用SimpleDataFormat或任何日期到字符串的转换,然后找到is-equalsJava 检查我的日历日期参数是否为当前日期,java,date,Java,Date,我只想找到date参数是当前日期(yyyy-MM-dd),而不使用SimpleDataFormat或任何日期到字符串的转换,然后找到is-equals 指定日期=2012-12-20 currentDate=2012-12-21 specifiedDate==currentDate 简单地说,我不希望验证时不包括时间(即HH:mm:S) 我试过类似的东西 public boolean isCurrentDate(Calendar date){ Calendar currentDate = Ca
指定日期=2012-12-20
currentDate=2012-12-21
specifiedDate==currentDate
简单地说,我不希望验证时不包括时间(即HH:mm:S)
我试过类似的东西
public boolean isCurrentDate(Calendar date){
Calendar currentDate = Calendar.getInstance().getTime();
if (currentDate.getDate()==(date.getTime().getDate())
&& currentDate.getMonth()==(date.getTime().getMonth())
&& currentDate.getYear()==(date.getTime().getYear()) )
{
return true;
}
return false;
}
请建议一个更好的方法,或者如果已经有任何库可用于此 如果您只想这样做,请尝试此操作 1)使用字符串
String s1 = new String("2012-01-27");
String s2 = new String("2011-01-28");
System.out.println(s1.compareTo(s2));
如果s1在词典编纂方面比s2“大”,并且这正是您所需要的,那么结果将是正确的。要获得更多信息,请阅读JavadocforCompareTo()方法
2)使用Joda时间
使用lib,您可以实现如下操作
DateTime first = ...;
DateTime second = ...;
LocalDate firstDate = first.toLocalDate();
LocalDate secondDate = second.toLocalDate();
return firstDate.compareTo(secondDate);
我更喜欢第二个选项您的最后一行
和¤tDate.getYear()==(date.getMonth())
似乎在比较年份和月份,而不是年份和年份。这可能是您的问题吗?在比较之前将时间字段设置为0怎么样
currentDate.set(Calendar.HOUR_OF_DAY, 0);
currentDate.set(Calendar.MINUTE, 0);
currentDate.set(Calendar.SECOND, 0);
currentDate.set(Calendar.MILLISECOND, 0);
如果您正在使用日历
public static boolean isSameDay(Calendar cal1, Calendar cal2) {
if (cal1 == null || cal2 == null) {
throw new IllegalArgumentException("The dates must not be null");
}
return (cal1.get(Calendar.ERA) == cal2.get(Calendar.ERA) &&
cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR) &&
cal1.get(Calendar.DAY_OF_YEAR) == cal2.get(Calendar.DAY_OF_YEAR));
}
public static boolean isToday(Calendar cal) {
return isSameDay(cal, Calendar.getInstance());
}
如果您使用的是日期
public static boolean isSameDay(Date date1, Date date2) {
if (date1 == null || date2 == null) {
throw new IllegalArgumentException("The dates must not be null");
}
Calendar cal1 = Calendar.getInstance();
cal1.setTime(date1);
Calendar cal2 = Calendar.getInstance();
cal2.setTime(date2);
return isSameDay(cal1, cal2);
}
public static boolean isToday(Date date) {
return isSameDay(date, Calendar.getInstance().getTime());
}
试试这个:
currentDate.set(Calendar.DATE,0)代码>时区
您问题中的示例代码忽略了时区这一关键问题。日期,即一天的开始点和结束点,由时区定义
java.util.Calendar和java.util.Date都没有指定时区。它们以UTC/GMT表示日期和时间
因此,您需要应用与应用程序和数据上下文相关的所需时区。这意味着你需要一个像样的约会时间库。除了java.util.Date/Calendar、java.text.SimpleDateFormat及其同级类之外的其他类,因为它们非常麻烦。使用Java 8(受Joda Time的启发,由JSR 310定义)中的任何一个或新绑定
请注意使用的方法是with timeatstartofday
。这是一天中的第一个时刻。通常是00:00:00,但不总是这样。夏令时(DST)或其他异常可能会产生不同的时间。这种方法巧妙地处理了这些问题
今天=时间跨度
从技术上讲,在处理日期时间值时,特定的“日期”实际上是一段时间。定义跨度的最常见和最有用的方法是“半开”,即开始是包含的,结束是独占的。这意味着,对于当前日期,我们希望从今天的第一刻(含)到明天的第一刻(不含)。然后我们询问目标日期时间是否在该范围内
还有其他方法可以完成这项工作。我之所以展示这种方法,是因为它适用于“今天”之外的情况
乔达时间
Joda Time提供了三个类来定义时间跨度:、期间和持续时间
示例代码
设置我们的输入数据,一个日历对象
// Create a Calendar object to simulate input.
java.util.Date date = DateTime.now().minusDays( 3 ).toDate();
java.util.Calendar cal = java.util.Calendar.getInstance();
cal.setTime( date );
将“今天”定义为一个时间跨度,并查看目标日期时间是否在该跨度内
DateTimeZone timeZone = DateTimeZone.forID( "Asia/Kolkata" );
DateTime dateTimeInQuestion = new DateTime( cal.getTimeInMillis(), timeZone );
DateTime now = new DateTime( timeZone );
Interval today = new Interval( now.withTimeAtStartOfDay(), now.plusDays( 1 ).withTimeAtStartOfDay() );
boolean isDateTimeInQuestionInInterval = today.contains( dateTimeInQuestion );
转储到控制台
System.out.println( "cal: " + cal.getTime() );
System.out.println( "dateTimeInQuestion: " + dateTimeInQuestion );
System.out.println( "now: " + now );
System.out.println( "today: " + today );
System.out.println( "isDateTimeInQuestionInInterval: " + isDateTimeInQuestionInInterval );
当运行时
加州时间:星期三2014年2月12日22:46:04太平洋标准时间
问题日期时间:2014-02-13T12:16:04.369+05:30
现在:2014-02-16T12:16:04.497+05:30
今天:2014-02-16T00:00:00.000+05:30/2014-02-17T00:00:00.000+05:30
isDateTimeInQuestionInInterval:false
@prabhu好的,只是检查一下。谢谢。但是,我不想做任何字符串比较。如果我使用第二个选项,我必须将我的日历实例转换为LocalDate(Joda)?DateTime first=DateTimeFormatter.forPattern(“yyyy-MM-dd”).parse(“2012-12-21”)@普拉布看看我的编辑。根据您的要求,无需使用SimpleDataFormat或任何日期到字符串转换!!您不想进行字符串比较,也不想使用SimpleDataFormatter。没有这一点,我没有进一步的解决办法。