如何使应用DateTime偏移量的方法有效/可重用-Java / Spring

时间:2019-07-09 15:22:41

标签: java spring hibernate

我正在检索报告中每个已访问地理围栏的纬度和经度,并使用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);
        }

    }

}

0 个答案:

没有答案