Я извлекаю широту и долготу каждой доступной геозоны в отчете и использую библиотеку 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);
}
}
}