我有2个日期变量,Date1和Date2。 我想检查日期1是否与Date2在同一天(但允许它们有不同的时间)。
我该怎么做?
这看起来真的很容易,但我很挣扎。
编辑:我想避免使用外部库和东西
编辑: 我的组织想法是删除小时,分钟,秒,但这些功能在Java中标记为折旧。那我应该怎么用????
答案 0 :(得分:10)
SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd");
return fmt.format(date1).equals(fmt.format(date2));
答案 1 :(得分:6)
虽然根据java.util.Date
的日期组成部分给出的答案在很多方面都已足够,但我要强调一点java.util.Date
不一个日期而是一种UNIX时间戳的测量单位,以毫秒为单位。结果是什么?
Date
的日期比较 - 时间戳将取决于上下文的时区。例如,在UTC时区中,仅日期比较是直接的,最后只比较年,月和日组件,请参阅其他答案(我不需要重复)。
但请考虑一下2011年西萨摩亚跨越国际日期的情况。您可以拥有java.util.Date
类型的有效时间戳,但如果您在萨摩亚考虑他们的日期部分,您甚至可以获得无效日期(2011年) -12-30从未在萨摩亚当地存在过)因此只比较日期部分可能会失败。此外,根据时区,日期组件通常可以与UTC区域中的本地日期相差一天,提前或落后,在最坏的情况下甚至会有两天的差异。
因此,对解决方案的扩展稍微更精确:
SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd");
fmt.setTimeZone(...); // your time zone
return fmt.format(date1).equals(fmt.format(date2));
对于首先将j.u.Date-timestamp转换为java.util.GregorianCalendar
,然后设置时区然后比较日期组件的程序化方法,也存在类似的扩展。
答案 2 :(得分:5)
为什么不简单地比较年,月和日?你可以编写你的方法,如:
private boolean isDateSame(Calendar c1, Calendar c2) {
return (c1.get(Calendar.YEAR) == c2.get(Calendar.YEAR) &&
c1.get(Calendar.MONTH) == c2.get(Calendar.MONTH) &&
c1.get(Calendar.DAY_OF_MONTH) == c2.get(Calendar.DAY_OF_MONTH));
}
答案 3 :(得分:5)
虽然其他答案可能是正确的,但我更倾向于我们认识到“今天”实际上是一段时间的方法。
由于夏令时(DST)等异常情况,天数长短不一,而且总是24小时不等。在美国,有些日子是23个小时,大约25个小时。
通常在数据时工作中,我们使用“半开”策略,其中跨度的开头是包含性的,结尾是独占的。所以这意味着“今天”从今天的第一个时刻开始,但不包括明天的第一个时刻。
如correct answer by Meno Hochschild中所述,时区至关重要。一天的第一时刻取决于其时区规则。
Joda-Time库有很好的类来处理时间跨度:句点,持续时间和Interval。
DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
DateTime now = new DateTime( timeZone );
Interval today = new Interval( now.withTimeAtStartOfDay(), now.plusDays(1).withTimeAtStartOfDay() );
DateTime dateTimeInQuestion = new DateTime( date ); // Convert java.util.Date.
boolean happensToday = today.contains( dateTimeInQuestion );
使用一段时间的这种方法有很多好处:
Java 8内置了一个新的java.time package。这些新类以Joda-Time为模型,但完全重新构建。可以使用java.time编写相同类型的代码。
答案 4 :(得分:0)
当你使用toString()方法时,你会得到什么?它只是年/月/日或时间吗?如果是,那么你可以简单地比较两个对象的字符串。 (date1.toString()等于(date2.toString())。);