使用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“
有更好的方法可以达到相同的效果吗?
答案 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)
可能会成功。谈谈快速和肮脏。