Как заставить метод применения смещений DateTime работать / повторно использовать - Java / Spring - PullRequest
0 голосов
/ 09 июля 2019

Я извлекаю широту и долготу каждой доступной геозоны в отчете и использую библиотеку Timeshape для сопоставления этих значений с часовым поясом.

Затем, основываясь на часовом поясе, я хочу применить смещениена дату и время входа и выхода в отчете.Я пытаюсь изменить код, я должен быть более пригодным для повторного использования / объектно-ориентированным.

Я уже создал метод String, который возвращает имя зоны [Europe / Berlin] путем передачи параметров lat / lng,

Я пытался сделать то же самое с преобразованием даты и времени в OffsetDateTime, передав затем имя зоны.

Это то, что у меня есть, и правильно манипулирует датой и временем.

public class GeofenceHistoryReportGenerator extends ReportGenerator {


    private TimeZoneEngine engine = TimeZoneEngine.initialize();


    public GeofenceHistoryReportGenerator(ReportCriteria reportCriteria) {
        super(reportCriteria);
    }

    @Override
    public Collection<GeoFenceActivityResult> generate() {

        IGeoAccessDAO geoAccessDAO = (IGeoAccessDAO) ServiceLocator.getUniqueInstance().get(ServiceLocatorKey.GEOACCESS_DAO);

        List<GeoFenceActivityResult> geoAccessList = geoAccessDAO.getByGeoFenceAndVehicle(reportCriteria.getStartDate(),
                reportCriteria.getEndDate(), reportCriteria.getGeoFenceIdList(), reportCriteria.getScheduleId(),
                reportCriteria.getTimeZoneOffset(), reportCriteria.getVehicleIds());

        for (GeoFenceActivityResult geoAccesss : geoAccessList) {

            Geofence geoFence = geoAccessDAO.get(Geofence.class, geoAccesss.getGeoFenceId());

            String zoneName = getZoneName(geoFence.getBoundaryLat1(), geoFence.getBoundaryLong1());
            ZoneRules zo = ZoneId.of(zoneName).getRules();

            Instant entryTime = geoAccesss.getEntryDate().toInstant();
            System.out.println("\nInstant entryTime = geoAccesss.getEntryDate().toInstant():\t" + entryTime);

            ZoneOffset standardOffset = zo.getStandardOffset(entryTime);
            System.out.println("\nZoneOffset standardOffset = zo.getStandardOffset(entryTime):\t" + standardOffset);

            OffsetDateTime odt = entryTime.atOffset(standardOffset);
            System.out.println("\nOffsetDateTime odt = entryTime.atOffset(standardOffset):\t" + odt);
        }

        return geoAccessList;
    }

    public String getZoneName(float lat, float lng) {

        Optional<ZoneId> zoneName = engine.query(lat, lng);

        if (zoneName.isPresent()) {
            return zoneName.get().toString();
        } else {
            int offsetGMT = (int) ((lng + 187.5f) / 15.0) - 12;
            return offsetGMT == 0 ? "Etc/GMT"
                    : offsetGMT > 0 ? String.format("Etc/GMT-%d", offsetGMT) : String.format("Etc/GMT+%d", -offsetGMT);
        }

    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...