我正在编写一个提醒应用程序,该应用程序应该在下面的代码段中包含一个hashmap(Lebanon
),其中包含不同的日期作为键,假日名称作为值。所以这是我的日历:
SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy");
Calendar current = Calendar.getInstance();
Calendar cal = Calendar.getInstance();
cal.set(pickerDate.getYear(),
pickerDate.getMonth(),
pickerDate.getDayOfMonth(),
pickerTime.getCurrentHour(),
pickerTime.getCurrentMinute(),
0
);
Date date12_1 = format.parse("1/1/2017");
Lebanon.put(date12_1, "New Year");
if (cal.getTime().compareTo(date12_1) > 0) {
info.setText(cal.getTime() + "BIGGER THAN " + date12_1);
} else if (cal.getTime().compareTo(date12_1) == 0) {
info.setText(cal.getTime() + "EQUAL TO " + date12_1);
} else if (cal.getTime().compareTo(date12_1) < 0) {
info.setText(cal.getTime() + "SMALLER THAN " + date12_1);
}
除了一件事之外,这段代码完美无缺:如果cal.gettime()
等于12月1日,它仍然更大。输出是:
Fri Dec 01 00:00:00 EET 2017 BIGGER THAN Fri Dec 01 00:00:00 EET 2017
答案 0 :(得分:0)
对于全天活动,Java 8+中的最佳表示是LocalDate
。 Calendar
由long
值支持,因此在您的情况下容易出错。另一方面,LocalDate
已实施equals()
和hashCode()
以完全适合您的用例。
如果您绝对必须坚持使用Java7并且Joda不是一个选项,请考虑在从选择器填充日历之前清除日历:
@Test
public void testCalendar() {
Calendar cal = Calendar.getInstance();
cal.setTime(new Date(0));
int year = cal.get(Calendar.YEAR);
int day = cal.get(Calendar.DAY_OF_MONTH);
int month = cal.get(Calendar.MONTH);
cal.set(Calendar.YEAR, 2016);
cal.set(Calendar.MONTH, 3);
cal.set(Calendar.DAY_OF_MONTH, 27);
assertEquals(cal.get(Calendar.MILLISECOND), 0);
}
Apache commons-lang3
中甚至还有DateUtils.isSameDay
。
答案 1 :(得分:0)
在设置时间后设置cal.set(pickerDate.getYear(),
pickerDate.getMonth(),
pickerDate.getDayOfMonth(),
pickerTime.getCurrentHour(),
pickerTime.getCurrentMinute(),
0
);
cal.set(Calendar.MILLISECOND,0);
对象中的毫秒数。
date12_1
如果它不起作用,获得正确结果的最佳方法是首先创建Calendar对象,然后创建getDate,它更简单,并为您提供更多更改选项。将您的Date date12_1 = format.parse("1/1/2017"); //change this line
更改为日历对象。
Calendar cal2 = Calendar.getInstance();
cal2.set(Calendar.YEAR, 2014);
cal2.set(Calendar.DAY_OF_YEAR, 1);
cal2.set(Calendar.MILLISECOND,0);
Date date12_1 = cal2.getTime();
到
{{1}}
答案 2 :(得分:0)
Calendar.getInstance()
还设置从系统时钟检索的毫秒数。
这意味着毫秒几乎总是大于0.我自己测试了,时间戳有不同的值:
System.out.println(date12_1.getTime());
System.out.println(cal.getTimeInMillis());
您还需要将毫秒设置为0:
setTimeInMillis(0)
cal.set(Calendar.MILLISECOND, 0);