我有2个日期变量,Date1和Date2.我想检查日期1是否与Date2在同一天(但允许它们有不同的时间).
我该怎么做呢?
这看起来真的很容易,但我正在努力.
编辑:我想避免外部库和东西
编辑:我的区域想法是删除小时,分钟,秒,但这些功能在Java中标记为折旧.那我该怎么用????
sil*_*ede 12
SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd");
return fmt.format(date1).equals(fmt.format(date2));
Run Code Online (Sandbox Code Playgroud)
虽然基于的日期组成部分给出的答案java.util.Date是足以在很多地方,我想强调的一点,一个java.util.Date是不是一个日期,但以毫秒计一种UNIX的时间戳.那是什么后果?
Date-timestamps 的仅日期比较将取决于上下文的时区.例如,在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));
Run Code Online (Sandbox Code Playgroud)
对于首先将juDate-timestamp转换为a java.util.GregorianCalendar,然后设置时区然后比较日期组件的程序化方法,也存在类似的扩展.
你为什么不简单地比较年,月和日?你可以编写你的方法,如下所示:
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));
}
Run Code Online (Sandbox Code Playgroud)
虽然其他答案可能是正确的,但我更倾向于我们认识到"今天"实际上是一段时间的方法.
由于夏令时(DST)等异常情况,天数的长短不一样,并不总是24小时.在美国,有些日子长达23小时,大约25天.
通常在数据时工作中,我们使用"半开"策略,其中跨度的开始是包含性的,结尾是独占的.所以这意味着"今天"从今天的第一个时刻开始,但不包括明天的第一个时刻.
时区是至关重要的,正如Meno Hochschild在正确答案中所解释的那样.一天的第一时刻取决于其时区规则.
该乔达时库具有良好的班的时间跨度处理:周期,持续时间和间隔.
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 );
Run Code Online (Sandbox Code Playgroud)
使用一段时间的这种方法有许多好处:
Java 8内置了一个新的java.time包.这些新类以Joda-Time为模型,但完全重新构建.可以使用java.time编写相同类型的代码.
| 归档时间: |
|
| 查看次数: |
15159 次 |
| 最近记录: |