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

Pra*_*ram 4 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()));
Run Code Online (Sandbox Code Playgroud)

输出现在

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

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

kgi*_*kis 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);
Run Code Online (Sandbox Code Playgroud)

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

  • 您必须使用cal.set(Calendar.HOUR_OF_DAY,0).Calendar.HOUR只是日历的12小时字段,将保持AM_PM字段不变,从而使24小时字段设置为0或12. (5认同)

Jen*_*nni 7

如果您有Apache commons,则可以使用DateUtils.truncate():

Date myDate = DateUtils.truncate(myObject.getDate(), Calendar.DATE)
Run Code Online (Sandbox Code Playgroud)

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


现在,如果您想要非常快速的"聪明"代码,并且您不介意使用已弃用的函数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);
Run Code Online (Sandbox Code Playgroud)