这应该是微不足道的:我想删除所有时间信息并留下一天设置:
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
Calendar calendar = Calendar.getInstance();
log.debug("{}", calendar.getTimeInMillis());
calendar.clear(Calendar.HOUR_OF_DAY);
log.debug("{}", calendar.getTimeInMillis());
calendar.clear(Calendar.MINUTE);
log.debug("{}", calendar.getTimeInMillis());
calendar.clear(Calendar.SECOND);
log.debug("{}", calendar.getTimeInMillis());
calendar.clear(Calendar.MILLISECOND);
log.debug("{}", calendar.getTimeInMillis());
String today = format.format(calendar.getTime());
但它留下了小时集:
06-03 07:14:31.296 1464930871295
06-03 07:14:31.297 1464930871295
06-03 07:14:31.297 1464930031295
06-03 07:14:31.298 1464930000295
06-03 07:14:31.299 1464930000000
06-03 07:14:31.300 Date is Thu Jun 02 07:00:00 GMT+02:00 2016
为什么?
更新
一些答案指出,Android javadoc可能是错的:
清除给定时间字段中的值,标记为未设置并为其指定零值。实际字段值将在下次访问字段时确定。
Javadoc of Oracle和Android Javadoc也说使用set(Calendar.HOUR_OF_DAY, 0)
(仅限小时):
HOUR_OF_DAY,HOUR和AM_PM字段是独立处理的,并且应用了时间的解析规则。清除其中一个字段不会重置此日历的小时值。使用set(Calendar.HOUR_OF_DAY,0)重置小时值。
清除日期以外的单位的另一种方法是通过以下方式将所有单位设置为0或默认最小值
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, calendar.getActualMinimum(Calendar.HOUR_OF_DAY));
calendar.set(Calendar.MINUTE, calendar.getActualMinimum(Calendar.MINUTE));
calendar.set(Calendar.SECOND, calendar.getActualMinimum(Calendar.SECOND));
calendar.set(Calendar.MILLISECOND, calendar.getActualMinimum(Calendar.MILLISECOND));
String today = format.format(calendar.getTime());
从关于clear(int field)
的日历文档:
Clears the value in the given time field, marking it unset and assigning it a value of zero.
The actual field value will be determined the next time the field is accessed.
所以,当你在calendar.getTimeInMillis()
中调用Log
时,会再次设置该值。如果要查看方法的工作原理,可以在那里设置断点并对其进行调试,以查看值的重置方式。