【问题标题】:Add String array into Calendar Array将字符串数组添加到日历数组中
【发布时间】: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


【解决方案1】:

您的代码示例的固定、清洁版本 :)(使用您的 JDK5 语言级别。Java 8 流 API 可能会进一步改进)

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);
        }
    }
}

【讨论】:

  • 在 Java 8 中,使用 LocalDate 代替 Calendar 可以显着改善它
  • 是的,新的 Date API 也可以提供帮助。但不知何故,他想要日历实例 =)
  • “不知何故”几乎总是意味着“不知道替代解决方案”:) LocalDate 要好得多,因为通过使用它,您可以摆脱错误时间擦除、错误时区等导致的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-19
  • 2011-04-03
  • 2015-02-15
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
相关资源
最近更新 更多