【发布时间】:2016-03-15 11:21:18
【问题描述】:
基本上我需要从数据库中获取一个动态字符串数组(将从数据库中填充,但在本例中它只是一个固定大小用于测试目的),将其转换为日历数组,以便我可以将其与当前日期迭代,以查看它是否等于星期六/星期日或新创建的日历数组中的任何天。
我的问题是 Calendar 数组没有被正确填充,因为当 while 循环将当前日期与假期集进行比较时没有考虑到它?
这是我目前的代码;
private static final String[] bankHolidays = {"25/03/2016","28/03/16","02/05/2016","20/05/2016"};
private static Set<Calendar> holidayDates;
static SimpleDateFormat sdf = new SimpleDateFormat("dd/mm/yyyy");
public static void main(String[] args) throws ParseException {
if(holidayDates == null) {
holidayDates = new HashSet<Calendar>();
Date[] hol = new Date[bankHolidays.length];
for(int i=0;i<bankHolidays.length;i++){
Date d = sdf.parse(bankHolidays[i]);
hol[i]= d;
}
for(Date day : hol) {
Calendar c = Calendar.getInstance();
c.setTime(day);
holidayDates.add(c);
}
}
在比较阶段的代码是;
if (startCal.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY && startCal.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY && !holidayDates.contains(startCal.get(Calendar.DAY_OF_YEAR)) ) {
++workDays;
}
有什么建议吗?
编辑:我最终想通了,但其中一个促成因素是使用 MM 而不是 mm 来比较日期。
【问题讨论】:
-
我不太确定您的问题是什么,但您的日期格式不正确。你可能想要
"dd/MM/yyyy" -
@ug_ 当我运行代码时,即使其中 2 个日期是在 5 月,它仍然会将所有日期格式化为 1 月。问题是我如何从一个字符串数组创建一个日历数组,我可以在 while 循环中比较当前日期以查看它是否匹配星期六、星期日或节假日?
-
@Rob 格式应该是
dd/MM/yyyy,因为mm表示“分钟”,而不是“月”,这就是为什么你总是得到一月。这是一个很常见的错误。 -
@Sasha 是的,我现在已经改变了,谢谢。 5 月有 2 个银行假期,还不明白吗?
-
@Rob 确保在将
Date转换为Calendar以获取从 DB 获取的日期时删除时间信息,并使其处于正确的时区。为了使Calendar实例相等(为了使Set#contains()正常工作),它们还必须具有相同的时间部分,而不仅仅是日期部分。
标签: java arrays calendar simpledateformat