Java 将字符串数组添加到日历数组中

Java 将字符串数组添加到日历数组中,java,arrays,calendar,simpledateformat,Java,Arrays,Calendar,Simpledateformat,基本上,我需要从数据库中获取一个动态字符串数组(该数组将从数据库中填充,但在本例中,它只是用于测试的固定大小),将其转换为日历数组,以便我可以将其与当前日期迭代进行比较,以查看它是否等于星期六/星期天或新创建的日历数组中的任何一天 我的问题是,日历数组没有正确填充,因为当while循环将当前日期与假日集进行比较时,它没有被考虑进去 这是我到目前为止的代码 private static final String[] bankHolidays = {"25/03/2016","28/03/16","

基本上,我需要从数据库中获取一个动态字符串数组(该数组将从数据库中填充,但在本例中,它只是用于测试的固定大小),将其转换为日历数组,以便我可以将其与当前日期迭代进行比较,以查看它是否等于星期六/星期天或新创建的日历数组中的任何一天

我的问题是,日历数组没有正确填充,因为当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);
        }
      }
有什么建议吗


编辑:我最终决定这么做,但其中一个促成因素是使用MM而不是MM来比较日期。

修复了代码示例的更干净版本:)(与JDK5语言级别一致。java 8 streams API可能会进一步改进)

private static final String[]bankHolidays={“25/03/2016”、“28/03/16”、“02/05/2016”、“20/05/2016”};
专用静态最终SimpleDataFormat sdf=新SimpleDataFormat(“dd/MM/yyyy”);
私人静态设置度假日期;
公共静态void main(字符串[]args)引发异常{
如果(holidayDates==null){
holidayDates=新HashSet();
对于(int i=0;i
我不太清楚您的问题是什么,但您的日期格式不正确。你可能想要“dd/MM/yyyy”@ug_u。当我运行代码时,即使其中两个日期在五月,它仍然将所有日期格式化为一月。问题是如何从一个字符串数组开始创建一个日历数组,我可以在while循环中比较当前日期,看它是否匹配周六、周日或假日?@Rob格式应该是
dd/MM/yyyy
,因为
MM
表示“分钟”,而不是“月”,这就是为什么总是得到一月。这是一个很常见的错误。@Sasha是的,我现在已经改变了,谢谢。5月有2个银行假日,这一点仍然没有发现?@Rob请确保在将从DB获取的日期转换为日历时删除时间信息,并将其设置在适当的时区。要使
Calendar
实例相等(为了使
Set#contains()
正常工作),它们还必须具有相同的时间部分,而不仅仅是日期部分。在Java 8中,可以通过使用
LocalDate
而不是
Calendar
来显著改进。但不知何故,他想要日历实例=)“不知何故”几乎总是指“不知道替代解决方案”:“
LocalDate
更好,因为通过使用它,您可以消除错误的时间擦除、错误的时区等导致的错误。
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;

        }
private static final String[] bankHolidays = {"25/03/2016", "28/03/16", "02/05/2016", "20/05/2016"};
private static final SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
private static Set<Calendar> holidayDates;

public static void main(String[] args) throws ParseException {
    if (holidayDates == null) {
        holidayDates = new HashSet<Calendar>();
        for (int i = 0; i < bankHolidays.length; i++) {
            Calendar c = Calendar.getInstance();
            Date date = sdf.parse(bankHolidays[i]);
            c.setTime(date);
            holidayDates.add(c);
        }
    }
}