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