如何在Android日历中添加假期?

时间:2014-04-09 10:17:46

标签: android calendar

我想在我的日历中添加一个假期列表。我正在使用Caldroid库来显示日历。我想在每个月显示一个假期列表,我需要在每个月中选择特定日期。我怎么做 ?以下是我的尝试:

代码:

Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, -18);
Date blueDate = cal.getTime();
cal = Calendar.getInstance();
cal.add(Calendar.DATE, 16);
int diff = cal.get(Calendar.JANUARY);
cal.add(diff, 10);
Date greenDate = cal.getTime(); 

我相信差异会将月份设置为1月并突出1月11日,因为我已将该值设为10,但它没有这样做,我相信这是因为我已经将cal实例化为{{ 1}}将返回当前月份。

更新:

感谢Meno,我已经实现了以下功能但是当我将日历设置为第二次时,它只需要更新值并且没有设置第一个日期(非常明显)但我想知道如何设置多个日期在一个月内没有为每个月重新实例化一个新的getInstance()对象。简单地说,如何在一个月内设置一组日期。

GregorianCalendar

提前致谢。

1 个答案:

答案 0 :(得分:1)

您的问题似乎并不清楚。不过我试着回答。而不是

cal = Calendar.getInstance(); // In Thailand this gives the buddhist calendar, do you want this?
cal.add(Calendar.DATE, 16); // 16 days from now, what is the intention or meaning???
cal.add(diff, 10); // first argument must be a defined constant in java.util.Calendar

我假设你只想选择一个固定的日期(假期)。如果是这样,那么您可以调用set() - 方法,而不需要添加日期来反复移动日历日期:

GregorianCalendar cal = new GregorianCalendar(); // including currrent year
cal.set(Calendar.MONTH, Calendar.JANUARY);
cal.set(Calendar.DAY_OF_MONTH, 11);

然后你得到当年1月11日的日期。顺便说一下:

int diff = cal.get(Calendar.JANUARY);

这一行是无稽之谈,因为:

Calendar.JANUARY是一个int常量,它为零,表示一个值(月份)而不是一个字段。但get(int) - 方法需要字段不变。值为零的字段常量对应于Calendar.ERA。最后,该行产生cal的时代,即int diff = GregorianCalendar.AD = 1;,假设您使用格里高利历。这肯定不是你想要的???

由于评论中的额外问题而更新:

重用意味着您不会为下一次计算创建新实例,但重用相同的实例(GregorianCalendar是可变的!)。例如:

GregorianCalendar cal = new GregorianCalendar(); // including currrent year
cal.set(Calendar.MONTH, Calendar.JANUARY);
cal.set(Calendar.DAY_OF_MONTH, 11);
Date holiday1 = cal.getTime();

cal.set(Calendar.MONTH, Calendar.DECEMBER); // no new instance => reuse cal
cal.set(Calendar.DAY_OF_MONTH, 24);
Date holiday2 = cal.getTime();

...

我还写过关于限制月份和日期操作的文章,因为操纵与周相关的字段,重用Calendar - 实例的状态取决于字段操作的顺序(非常难看和奇怪)。

无论如何,使用Java 8(在Android上不可用),JodaTime和我的alpha-state-library中提供的 immutable 类型总是更安全。我承认,与JodaTime的第一次接触可能会让你感觉像丢失了,因为有很多方法(文档标准对开源有好处但不如JSR-310中那么好)。在你的用例中,我会使用类型org.joda.time.LocalDate作为开始,因为你真的只有一个简单的用例。如果您想查看原始Joda文档之外的更多文档,Google和SO就是您的朋友。

因延长提问而更新:

您忘记了新代码中的一件重要事情,即将日历设置的结果添加到假日列表中,请参阅此处的修改:

List<Date> holidays = new ArrayList<Date>();

GregorianCalendar greg_cal = new GregorianCalendar();
greg_cal.set(Calendar.MONTH, Calendar.JANUARY);
greg_cal.set(Calendar.DAY_OF_MONTH, 1);
holidays.add(greg_cal.getTime());

greg_cal.set(Calendar.MONTH, Calendar.JANUARY);
greg_cal.set(Calendar.DAY_OF_MONTH, 18);
holidays.add(greg_cal.getTime());

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

for (Date d : holidays) {
  System.out.println(sdf.format(d));
}

// output:
2014-01-01
2014-01-18

在像JodaTime这样的外部库中,您只需使用org.joda.time.LocalDate

List<LocalDate> holidays = new ArrayList<LocalDate>();
LocalDate today = LocalDate.now();
holidays.add(today.withMonthOfYear(1).withDayOfMonth(1));
holidays.add(today.withMonthOfYear(1).withDayOfMonth(18));

这很简单(类似于我未完成的日期和时间库)。