我正在检索报告中每个已访问地理围栏的纬度和经度,并使用Timeshape库将这些值映射到时区。
然后,基于时区,我想对报表的进入和退出日期时间应用偏移量。我正在尝试更改必须具有更高可重用性/面向对象的代码。
我已经创建了一个String方法,该方法通过传入lat / lng参数来返回区域名称[Europe / Berlin]。
我试图通过传入区域名称来将日期时间转换为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);
}
}
}