【问题标题】:Convert Calendar to LocalDate将日历转换为 LocalDate
【发布时间】:2018-02-26 07:39:31
【问题描述】:

我决定从 5.5 升级到 Optaplanner 7.5 Nurseroster,但遇到了一些愚蠢的问题。下面是一个。我之前使用的例程如下。然而,现在新版本需要 LocalDate。我有一个 MySql 数据库后端,用户通过日历选择名册计划计划。任何建议将不胜感激。

int shiftDateSize = maxDayIndex + 1;
        List<ShiftDate> shiftDateList = new ArrayList<ShiftDate>(shiftDateSize);
        //shiftDateMap = new HashMap<String, ShiftDate>(shiftDateSize);
        long id = 0L;
        int dayIndex = 0;
        calendar.setTime(startDate);
        for (int i = 0; i < shiftDateSize; i++) {
            ShiftDate shiftDate = new ShiftDate();
            shiftDate.setId(id);
            shiftDate.setDayIndex(dayIndex);
            **String dateString = dateFormat.format(calendar.getTime());**
            shiftDate.setDateString(dateString);
            **shiftDate.setDayOfWeek(DayOfWeek.valueOfCalendar(calendar.get(Calendar.DAY_OF_WEEK)));**
            shiftDate.setShiftList(new ArrayList<Shift>());
            shiftDateList.add(shiftDate);
            shiftDateMap.put(dateString, shiftDate);
            id++;
            dayIndex++;
            calendar.add(Calendar.DAY_OF_YEAR, 1);
        }
        nurseRoster.setShiftDateList(shiftDateList);
    } 

【问题讨论】:

标签: java optaplanner


【解决方案1】:

我已尝试使用以下代码从 Calendar

获取 LocalDate
Calendar calendar = Calendar.getInstance();
TimeZone tz = calendar.getTimeZone();
ZoneId zid = tz == null ? ZoneId.systemDefault() : tz.toZoneId();
LocalDate localDate = LocalDateTime.ofInstant(calendar.toInstant(), zid).LocalDate();

或者只是一行:

LocalDate localDate = LocalDateTime.ofInstant(calendar.toInstant(), calendar.getTimeZone().toZoneId()).toLocalDate();

我已通过此链接Convert Calendar to LocalDateTime 执行这些步骤

【讨论】:

    【解决方案2】:

    在 Java 8 中你可以这样做

    LocalDateTime.ofInstant(cal.toInstant(), ZoneId.systemDefault())
    

    【讨论】:

      【解决方案3】:

      Java 9

      import java.util.Calendar;
      import java.time.LocalDate;
      import java.time.ZoneId;
      
      LocalDate.ofInstant(calendar.toInstant(), ZoneId.systemDefault());
      

      【讨论】:

        【解决方案4】:

        下面的代码可能也可以。

        Calendar cal = Calendar.getInstance();
        Date input = cal.getTime();
        LocalDate da = input.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
        

        这首先获取 Date 类型的日期,然后据我所知将其转换为 LocalDate 格式。

        【讨论】:

          【解决方案5】:

          如果您从 SQL 数据库中读取 LocalDate(Time) 并且是唯一的 API 连接点(因此日历不会在任何地方公开),那么根本不要使用日历

          使用支持 LocalDate(Time) 的 Hibernate/JPA 或 JDBC 版本并直接从数据库中读取。他们多年来一直支持它,但连接到 MySQL 的 hibernate/JPA 或 JDBC 版本可能较旧。

          容易出错,从数据库中读取日期作为日历,然后将日历转换为 LocalDate(Time)。 java.util.Calendar 本质上是损坏的,这就是创建 LocalDate(Time) 的原因。 IIRC,错误包括对操作系统设置(时区、夏令时规则等)的依赖,使其行为依赖于机器。

          如果您的 API 中公开了日历,那么这个答案当然不会起作用。

          【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-07-22
          • 1970-01-01
          • 1970-01-01
          • 2018-06-03
          • 2016-02-23
          • 2012-02-18
          • 2018-07-15
          相关资源
          最近更新 更多