将日历日期转换为LocalDate

时间:2018-02-26 07:39:31

标签: java optaplanner

我决定从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);
    } 

5 个答案:

答案 0 :(得分:2)

我尝试了以下代码从日历

获取 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

遵循了这些步骤

答案 1 :(得分:2)

在Java 8中,您可以做

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

答案 2 :(得分:0)

以下代码也可能适用。

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

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

答案 3 :(得分:0)

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

使用支持LocalDate(Time)的Hibernate / JPA或JDBC版本,并直接从数据库中读取该版本。他们已经支持了很多年,但是连接到MySQL的hibernate / JPA或JDBC版本可能更旧。

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

如果您的API中公开了Calendar,则此答案当然将无效。

答案 4 :(得分:0)

Java 8

import java.util.Calendar;
import java.time.LocalDate;
import java.time.ZoneId;

LocalDate.ofInstant(calendar.toInstant(), ZoneId.systemDefault());