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

时间:2010-08-25 13:15:48

标签: java date

使用JDK中的Classes从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}“5月26日星期三   00:00:00 BST 2010“

有更好的方法可以达到相同的效果吗?

5 个答案:

答案 0 :(得分: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);

此外,您无需担心区域设置,这可能会导致字符串到日期转换出现问题。

答案 1 :(得分:7)

如果你有Apache公共,你可以使用DateUtils.truncate()

Date myDate = DateUtils.truncate(myObject.getDate(), Calendar.DATE)

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


现在,如果您想要非常快速的“聪明”代码,并且不介意使用java.util.Date中已弃用的函数,那么这是另一种解决方案。 (免责声明:我不会自己使用这些代码。但是我已经测试了它并且它有效,即使在DST开始/结束的日子也是如此。)

long ts = myObject.getDate().getTime() - myObject.getDate().getTimezoneOffset()*60000L;
Date myDate = new Date(ts - ts % (3600000L*24L));
myDate.setTime(myDate.getTime() + myDate.getTimezoneOffset()*60000L);

答案 2 :(得分:1)

这些方法已弃用,但如果给定Date,您可以执行以下操作:

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

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

应该提到的是,如果它是一个选项,你应该使用Joda-Time

相关问题

答案 3 :(得分:0)

您是否考虑了时区?我现在看到你有BST,但BST结束了什么?你还想使用BST吗?

无论如何,我建议您查看DateMidnight中的JodaTime并使用它。

根据您希望如何处理时区,情况可能会有所不同。但在最简单的形式中,它应该如下:

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

如果必须转换回java.util.Date

Date myDate = d.toDate();

答案 4 :(得分:0)

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

可能会成功。谈谈快速和肮脏。