Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert Calendar to LocalDate

I decided to upgrade from 5.5 to Optaplanner 7.5 Nurseroster but have run into a number of silly issues. Below is one. The routine I previously used is below. Now however the new version requires LocalDate. I have an MySql database back-end and the users select the roster schedule planner via a calendar. Any suggestions will be appreciated.

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);
    } 
like image 827
Rod182211 Avatar asked Feb 26 '18 07:02

Rod182211


4 Answers

I have tried the following code to get the LocalDate from Calendar

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

or simply in one line:

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

I have followed these steps from this link Convert Calendar to LocalDateTime

like image 181
Asad Shakeel Avatar answered Oct 23 '22 04:10

Asad Shakeel


In Java 8 you can just do

LocalDateTime.ofInstant(cal.toInstant(), ZoneId.systemDefault())
like image 26
Volker Bach Avatar answered Oct 23 '22 02:10

Volker Bach


Java 9

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

LocalDate.ofInstant(calendar.toInstant(), ZoneId.systemDefault());
like image 42
Maksym Avatar answered Oct 23 '22 04:10

Maksym


The following code probably works too.

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

This first gets the date in Date type and then converts it to LocalDate format as far as I know.

like image 24
dilanSachi Avatar answered Oct 23 '22 02:10

dilanSachi