从Java Date对象中删除时间的最有效方法是什么?

4

如何使用JDK内的类从Java日期对象中最有效地删除时间部分?

我有以下内容

myObject.getDate() = {java.util.Date}"Wed May 26 23:59:00 BST 2010"

要将时间重置为00:00:00,我正在执行以下操作

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Date myDate = sdf.parse(sdf.format(myObject.getDate()));

现在的输出结果是:

myDate = {java.util.Date}"Wed May 26 00:00:00 BST 2010"

有没有更好的方法来实现相同的结果?


考虑使用JODA Time。http://joda-time.sourceforge.net/;它更加愉悦易用。此外,参考https://dev59.com/KHE85IYBdhLWcg3wMAfc。 - polygenelubricants
很抱歉,这对我来说不是一个选项。我正在使用第三方应用程序,无法添加其他的JAR文件。 - Pram
5个回答

10

更详细,但可能更高效:

    Calendar cal = GregorianCalendar.getInstance();
    cal.setTime(date);
    // cal.set(Calendar.HOUR, 0);   // As jarnbjo pointed out this isn't enough
    cal.set(Calendar.HOUR_OF_DAY, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);

另外,您无需担心区域设置可能导致字符串转换为日期时出现问题。


我刚试了一下,输出如下:myDate = {java.util.Date}"Wed May 26 12:00:00 BST 2010"。 - Pram
我通过调用cal.getTime()从cal中获取一个Date对象。 - Pram
1
GregorianCalendar.getInstance(); 这行代码除了 Calendar.getInstance(); 什么也没做。它是 Calendar 类的一个静态方法,这只是一个不必要的导入。 - Sean Patrick Floyd
5
你需要使用 cal.set(Calendar.HOUR_OF_DAY, 0),Calendar.HOUR 仅为日历的12小时制字段,而不会更改 AM_PM 字段,这将导致24小时制字段被设置为0或12。 - jarnbjo
@whiskeysierra,GregorianCalendar 没有声明任何 getInstance 方法,因此 GregorianCalendar.getInstance() 只是调用 Calendar.getInstance() 的一种奇怪方式。在我看来,这些“间接”的静态调用不应该被允许,并且应该避免使用。 - Daniel Lubarov
显示剩余2条评论

8
如果您有Apache commons,您可以使用DateUtils.truncate()
Date myDate = DateUtils.truncate(myObject.getDate(), Calendar.DATE)

如果您无法访问Apache Commons,则DateUtils.truncate()的实现与kgiannakakis的答案基本相同。


现在,如果你想要非常快速而且“聪明”的代码,并且不介意使用已弃用的java.util.Date函数,这里有另一种解决方案。(免责声明:我自己不会使用这段代码。但是我已经测试过了,它可以工作,即使在夏令时开始/结束的日子里。)
long ts = myObject.getDate().getTime() - myObject.getDate().getTimezoneOffset()*60000L;
Date myDate = new Date(ts - ts % (3600000L*24L));
myDate.setTime(myDate.getTime() + myDate.getTimezoneOffset()*60000L);

1

这些方法已被弃用,但是如果给定一个 Date,你可以像这样做:

Date d = ...;
d.setHours(0);
d.setMinutes(0);
d.setSeconds(0);

如果可能,应该使用Calendar。然后你会使用cal.set(Calendar.MINUTE, 0)等。

值得一提的是,如果可以选择,你应该使用Joda-Time

相关问题


0

你有考虑时区吗?我看到你现在使用的是BST,但是BST结束后怎么办?你还想继续使用BST吗?

无论如何,我建议你查看DateMidnightJodaTime并使用它们。

根据你处理时区的方式,情况可能会有所不同。但是在最简单的形式下,应该很简单:

DateMidnight d = new DateMidnight(myObject.getDate());

如果你必须要转换回去,请使用java.util.Date

Date myDate = d.toDate();

0
myDate.setTime(myDate.getTime()-myDate.getTime()%86400000)

可能会奏效。说起来很快又脏。


哈哈,我知道那会让我的声望分数下降,但是我忍不住了。 - Erich Kitzmueller

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