我决定从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);
}
答案 0 :(得分:2)
我尝试了以下代码从日历
获取 LocalDateCalendar 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();
遵循了这些步骤
答案 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());