如何判断java.util.Date对象是否包含时间部分?

14
我们将日期和时间存储为Date对象。 但是,后来我们需要能够确定Date对象是日期还是日期时间。 05/18/05 00:00:00和05/18:05都有小时/分钟部分。我无法真正区分它们。

好奇地问,Java没有比较不同日期格式的方法吗?在.NET中这很容易。 - Jason
日历 c = 日历.getInstance(); 日期 x; //填充一些数据 c.setTime(x); c.get(Calendar.YEAR) //或者你想要的字段 - Luiggi Mendoza
@Jason Java中的“日期格式”用于呈现/解析。日期只是自1970年以来毫秒数的包装长整型,您可以进行比较。日期没有“格式”-它们由DateFormat对象格式化。 - Bohemian
dd-mm-yyyy和yyyy-mm-dd都可能令人困惑。我建议使用dd-Mon-YYYY(例如,对于英语受众而言,13-Feb-2012)比这两种格式都要少令人困惑。 - DwB
1
yyyy-mm-dd怎么会令人困惑呢?对于一些人来说可能还不熟悉,即使它是标准,但仍然感到困惑? - Hauke Ingmar Schmidt
7个回答

8

如果您的日期时间不保证是在午夜,即它们从不具有00:00:00HH:mm:ss,那么没有确定的方法可以区分刚好是午夜的“日期”和日期时间。

如果您的日期时间从不在午夜,则:

if (new SimpleDateFormat("HH:mm:ss").format(object).equals("00:00:00"))

如果要确定对象是否为"日期",可以执行以下操作。

我认为您的设计有缺陷,应该寻找其他解决方案。我也认为类的名称有缺陷,并引起了这种混淆。


"00:00:00".equals(new SimpleDateFormat("hh:mm:ss").format(object)); - rptmat57
更好的做法是把字符串字面量放在另一边。尽管我不认为 format 方法会返回 null。 - rptmat57
还有,应该是“HH:mm:ss”而不是“hh:mm:ss”吧? - rptmat57
1
Java中的Yoda条件仅用于避免在null上调用方法时引起NPE,但在这里它并没有帮助,因为.format()的返回值不能为null。是的,应该是HH:mm:ss - Bohemian

6

java.util.Date实际上是一个时间点,而不是日期,因此无法仅将其用作日期。您需要想出一个不同的方法。


1
是的。这种方法是有缺陷的。我们需要为日期和日期时间拥有不同的对象。 - thinkanotherone
2
我无法相信这被标记为最佳答案。这不是一个解决方案,只是一种观点。 - FiruzzZ
有时候解决方案就是没有解决方案。 - simon

3
使用 Apache commons-lang-3:
DateUtils.truncate(fecha, Calendar.DAY_OF_MONTH).equals(fecha)

1
不需要解析、格式化或第三方库。您可以轻松完成以下操作:
Calendar c = ...
c.setTime(date);
//this doesn't care about nanos
if(c.get(Calendar.HOUR_OF_DAY) + c.get(Calendar.MINUTE) + c.get(Calendar.SECOND) > 0) {
....
}

提示:我用1000-25,000个对象来实现这个功能,似乎不会影响性能,但当然这取决于您想在何处和为何这样做。


这种方法是否更有效,还是像_Bohemian_所描述的那样将时间部分作为“String”进行比较? - dk7
1
正如我所说,这种“方法”不需要SimpleDateFormat(如果您要多次进行比较,它不是一个廉价的对象),而且SDF不是线程安全的,因此根据上下文(多线程)可能会失败,还有一些与主题无关的原因。 - FiruzzZ

0

你可以使用Google的DateTime库进行验证。

它具有parseDateTime和parseDate方法,如果格式不正确,则会抛出NumberFormatException异常。

然后,你可以这样做...

try {
   DateTime someVar = DateTime.parseDate("your_date_as_a_string");
} catch (java.lang.NumberFormatException nfe) {
  // This isn't a date...
}

try {
   DateTime someVar = DateTime.parseDateTime("your_date_as_a_string");
} catch (java.lang.NumberFormatException nfe) {
  // This isn't a date/time...
}

1
你应该避免使用异常进行流程控制! - Bohemian
事实上,当处理用户输入(例如网页表单中的文本框)并需要验证用户是否正确提供了日期时,使用解析器对其提供的输入进行验证是我所知道的唯一方法... - Zack Macomber

0

我明白你实际上正在处理从JDBC ResultSet获取的java.sql.Datejava.sql.Timestamp实例,而它们是针对其超类java.util.Date声明的,对吗?

如果是这样,只需使用instanceof

if (date instanceof java.sql.Date) {
    // It was originally a DATE.
} else if (date instanceof java.sql.Timestamp) {
    // It was originally a TIMESTAMP (DATETIME).
}

0

虽然我同意在这里发布的关于修改原始时间值以查看其是否具有时间部分的解决方案,就像Dmitri所说的那样,缺陷是如果 Date 值恰好具有午夜时间部分,则无法判断。

因此,在这里稍微思考一下,您可以创建自己的类来扩展 Date ,该类具有名为“isDateTime”的布尔成员变量。当您最初加载日期或日期时间值时,根据它是否为日期时间,将该布尔值设置为 true 或 false。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接