class IMSTimePoint implements Comparable<IMSTimePoint> {

    public static List<IMSTimePoint> build(List<Range> ranges)
    {
        List<IMSTimePoint> imsTimePointList = new ArrayList<>();
        IMSTimePoint localIMSTimePoint;

        DateTimeFormatter formatDate = DateTimeFormatter.ofPattern(DATE_FORMAT);

        LocalDate startlocaldate;
        LocalDate endlocaldate;
        LocalTime startlocalhour;
        LocalTime endlocalhour;

        long startDateTimeEpochMillis;

        //parse from st to ed, sh to eh
        for (Range elt : ranges)
        {
            startlocaldate = LocalDate.parse(elt.getSt(), formatDate);
            startlocalhour = LocalTime.of(Integer.parseInt(elt.getSh()), 0, 0, 0);

            endlocaldate = LocalDate.parse(elt.getEd(), formatDate);
            endlocalhour = LocalTime.of(Integer.parseInt(elt.getEh()), 0, 0, 0);

            LocalDateTime localStartDateTime = LocalDateTime.of(startlocaldate, startlocalhour);
            startDateTimeEpochMillis = localStartDateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();

            LocalDateTime localEndDateTime = LocalDateTime.of(endlocaldate, endlocalhour);
            localIMSTimePoint = new IMSTimePoint(startDateTimeEpochMillis);
            imsTimePointList.add(localIMSTimePoint);

            while (localStartDateTime.isBefore(localEndDateTime))
            {
                localStartDateTime = localStartDateTime.plusHours(1);
                startDateTimeEpochMillis = localStartDateTime.
                        atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
                localIMSTimePoint = new IMSTimePoint(startDateTimeEpochMillis);
                imsTimePointList.add(localIMSTimePoint);
            }
        }

        return imsTimePointList;
    }

    public  IMSTimePoint(long epochTime);

}