清除Calendar.HOUR无法在Android上运行

时间:2016-06-03 05:25:05

标签: android calendar

这应该是微不足道的:我想删除所有时间信息并留下一天的日期:

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可能是错的:

  

清除给定时间字段中的值,标记为未设置和   为其赋值为零。实际的字段值将是   下次访问该字段时确定。

3 个答案:

答案 0 :(得分:4)

Javadoc of OracleAndroid Javadoc也表示使用set(Calendar.HOUR_OF_DAY, 0)(仅限小时):

  

HOUR_OF_DAY,HOUR和AM_PM字段是独立处理的   应用了时间的解决规则。清除一个   字段不会重置此日历的小时值。   使用set(Calendar.HOUR_OF_DAY,0)重置小时值。

答案 1 :(得分:1)

清除日期以外的单位的另一种方法是将所有单位设置为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());

答案 2 :(得分:0)

关于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时,会再次设置该值。如果你想看看这个方法是如何工作的,你可以在那里设置一个断点并对其进行调试,看看这些值是如何重置的。