From dc6cd97c9580425101c393fd7aba3535ee8d0e3c Mon Sep 17 00:00:00 2001 From: zy <82248909@qq.com> Date: Mon, 16 Mar 2026 16:33:52 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=97=B6=E9=97=B4=E6=88=B3?= =?UTF-8?q?=E6=A0=A1=E9=AA=8Cbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/lanhai/entity/SurvHisdataAir.java | 9 +- .../entity/SurvHisdataLivestockwater.java | 10 +- .../SurvHisdataLivestockwaterError.java | 8 +- .../lanhai/entity/SurvHisdataOrientwater.java | 9 +- .../entity/SurvHisdataOrientwaterError.java | 8 +- .../com/lanhai/entity/SurvHisdataSoil.java | 9 +- .../com/lanhai/entity/SurvTransdataAir.java | 7 +- .../entity/SurvTransdataLivestockwater.java | 8 +- .../entity/SurvTransdataOrientwater.java | 7 +- .../com/lanhai/entity/SurvTransdataSoil.java | 7 +- .../o/iot/renke/RenkeDataRealTimeDetail.java | 12 +- .../service/Impl/CommonServiceImpl.java | 10 +- .../SurvHisdataLivestockwaterServiceImpl.java | 10 +- .../SurvHisdataOrientwaterServiceImpl.java | 10 +- .../Impl/SurvHisdataSoilServiceImpl.java | 19 +- .../Impl/SurvIotVirtualDeviceServiceImpl.java | 5 +- .../Impl/SurvTransdataAirServiceImpl.java | 10 +- ...urvTransdataLivestockwaterServiceImpl.java | 5 +- .../SurvTransdataOrientwaterServiceImpl.java | 5 +- .../Impl/SurvTransdataSoilServiceImpl.java | 28 +- src/main/java/com/lanhai/util/DataUtil.java | 5 +- .../java/com/lanhai/util/DateTimeUtils.java | 318 ++++++++++++++++++ src/main/java/com/lanhai/util/SdrkUtils.java | 8 +- 23 files changed, 435 insertions(+), 92 deletions(-) create mode 100644 src/main/java/com/lanhai/util/DateTimeUtils.java diff --git a/src/main/java/com/lanhai/entity/SurvHisdataAir.java b/src/main/java/com/lanhai/entity/SurvHisdataAir.java index 7c2aeb0..4724ebf 100644 --- a/src/main/java/com/lanhai/entity/SurvHisdataAir.java +++ b/src/main/java/com/lanhai/entity/SurvHisdataAir.java @@ -9,6 +9,7 @@ import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import java.io.Serializable; +import java.time.LocalDateTime; import java.util.Date; /** @@ -84,7 +85,7 @@ public class SurvHisdataAir extends Model { * 数据更新时间 */ @TableField("DATA_DATE_TIME") - private Date dataDateTime; + private LocalDateTime dataDateTime; /** * 数据类型;realTime=实时,dayTime=日数据,month=月数据,year=年数据 @@ -144,7 +145,7 @@ public class SurvHisdataAir extends Model { * 转储时间 */ @TableField("TRANS_DATE") - private Date transDate; + private LocalDateTime transDate; /** * 租户号 @@ -168,7 +169,7 @@ public class SurvHisdataAir extends Model { * 创建时间 */ @TableField("CREATE_TIME") - private Date createTime; + private LocalDateTime createTime; /** * 更新人 @@ -186,7 +187,7 @@ public class SurvHisdataAir extends Model { * 更新时间 */ @TableField("UPDATED_TIME") - private Date updatedTime; + private LocalDateTime updatedTime; /** * 更新时间 diff --git a/src/main/java/com/lanhai/entity/SurvHisdataLivestockwater.java b/src/main/java/com/lanhai/entity/SurvHisdataLivestockwater.java index 3bdfb9f..037f1ec 100644 --- a/src/main/java/com/lanhai/entity/SurvHisdataLivestockwater.java +++ b/src/main/java/com/lanhai/entity/SurvHisdataLivestockwater.java @@ -2,6 +2,8 @@ package com.lanhai.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.extension.activerecord.Model; + +import java.time.LocalDateTime; import java.util.Date; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableField; @@ -123,7 +125,7 @@ public class SurvHisdataLivestockwater extends Model * 数据更新时间 */ @TableField("DATA_DATE_TIME") - private Date dataDateTime; + private LocalDateTime dataDateTime; /** * 数据类型;realTime=实时,dayTime=日数据,month=月数据,year=年数据 @@ -183,7 +185,7 @@ public class SurvHisdataLivestockwater extends Model * 转储时间 */ @TableField("TRANS_DATE") - private Date transDate; + private LocalDateTime transDate; /** * 租户号 @@ -207,7 +209,7 @@ public class SurvHisdataLivestockwater extends Model * 创建时间 */ @TableField("CREATE_TIME") - private Date createTime; + private LocalDateTime createTime; /** * 更新人 @@ -225,7 +227,7 @@ public class SurvHisdataLivestockwater extends Model * 更新时间 */ @TableField("UPDATED_TIME") - private Date updatedTime; + private LocalDateTime updatedTime; @Override diff --git a/src/main/java/com/lanhai/entity/SurvHisdataLivestockwaterError.java b/src/main/java/com/lanhai/entity/SurvHisdataLivestockwaterError.java index d6cda62..20ba6e5 100644 --- a/src/main/java/com/lanhai/entity/SurvHisdataLivestockwaterError.java +++ b/src/main/java/com/lanhai/entity/SurvHisdataLivestockwaterError.java @@ -2,6 +2,8 @@ package com.lanhai.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.extension.activerecord.Model; + +import java.time.LocalDateTime; import java.util.Date; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableField; @@ -120,7 +122,7 @@ public class SurvHisdataLivestockwaterError extends Model { * 数据更新时间 */ @TableField("DATA_DATE_TIME") - private Date dataDateTime; + private LocalDateTime dataDateTime; /** * 数据类型;realTime=实时,dayTime=日数据,month=月数据,year=年数据 @@ -186,7 +187,7 @@ public class SurvHisdataOrientwater extends Model { * 转储时间 */ @TableField("TRANS_DATE") - private Date transDate; + private LocalDateTime transDate; /** * 租户号 @@ -210,7 +211,7 @@ public class SurvHisdataOrientwater extends Model { * 创建时间 */ @TableField("CREATE_TIME") - private Date createTime; + private LocalDateTime createTime; /** * 更新人 @@ -228,7 +229,7 @@ public class SurvHisdataOrientwater extends Model { * 更新时间 */ @TableField("UPDATED_TIME") - private Date updatedTime; + private LocalDateTime updatedTime; diff --git a/src/main/java/com/lanhai/entity/SurvHisdataOrientwaterError.java b/src/main/java/com/lanhai/entity/SurvHisdataOrientwaterError.java index ff67e8f..9db6dbf 100644 --- a/src/main/java/com/lanhai/entity/SurvHisdataOrientwaterError.java +++ b/src/main/java/com/lanhai/entity/SurvHisdataOrientwaterError.java @@ -2,6 +2,8 @@ package com.lanhai.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.extension.activerecord.Model; + +import java.time.LocalDateTime; import java.util.Date; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableField; @@ -159,7 +161,7 @@ public class SurvHisdataOrientwaterError extends Model { * 数据更新时间 */ @TableField("DATA_DATE_TIME") - private Date dataDateTime; + private LocalDateTime dataDateTime; /** * 数据类型;realTime=实时,dayTime=日数据,month=月数据,year=年数据 @@ -268,7 +269,7 @@ public class SurvHisdataSoil extends Model { * 转储时间 */ @TableField("TRANS_DATE") - private Date transDate; + private LocalDateTime transDate; /** * 租户号 @@ -292,7 +293,7 @@ public class SurvHisdataSoil extends Model { * 创建时间 */ @TableField("CREATE_TIME") - private Date createTime; + private LocalDateTime createTime; /** * 更新人 @@ -310,7 +311,7 @@ public class SurvHisdataSoil extends Model { * 更新时间 */ @TableField("UPDATED_TIME") - private Date updatedTime; + private LocalDateTime updatedTime; /** * 更新时间 diff --git a/src/main/java/com/lanhai/entity/SurvTransdataAir.java b/src/main/java/com/lanhai/entity/SurvTransdataAir.java index 8198669..52142f7 100644 --- a/src/main/java/com/lanhai/entity/SurvTransdataAir.java +++ b/src/main/java/com/lanhai/entity/SurvTransdataAir.java @@ -9,6 +9,7 @@ import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import java.io.Serializable; +import java.time.LocalDateTime; import java.util.Date; /** @@ -83,7 +84,7 @@ public class SurvTransdataAir extends Model { * 数据更新时间 */ @TableField("DATA_DATE_TIME") - private Date dataDateTime; + private LocalDateTime dataDateTime; /** * 数据类型;realTime=实时,dayTime=日数据,month=月数据,year=年数据 @@ -161,7 +162,7 @@ public class SurvTransdataAir extends Model { * 创建时间 */ @TableField("CREATE_TIME") - private Date createTime; + private LocalDateTime createTime; /** * 更新人 @@ -179,7 +180,7 @@ public class SurvTransdataAir extends Model { * 更新时间 */ @TableField("UPDATED_TIME") - private Date updatedTime; + private LocalDateTime updatedTime; /** * 更新时间 diff --git a/src/main/java/com/lanhai/entity/SurvTransdataLivestockwater.java b/src/main/java/com/lanhai/entity/SurvTransdataLivestockwater.java index 0672013..cd16130 100644 --- a/src/main/java/com/lanhai/entity/SurvTransdataLivestockwater.java +++ b/src/main/java/com/lanhai/entity/SurvTransdataLivestockwater.java @@ -2,6 +2,8 @@ package com.lanhai.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.extension.activerecord.Model; + +import java.time.LocalDateTime; import java.util.Date; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableField; @@ -125,7 +127,7 @@ public class SurvTransdataLivestockwater extends Model { * 数据更新时间 */ @TableField("DATA_DATE_TIME") - private Date dataDateTime; + private LocalDateTime dataDateTime; /** * 数据类型;realTime=实时,dayTime=日数据,month=月数据,year=年数据 @@ -211,7 +212,7 @@ public class SurvTransdataOrientwater extends Model { * 创建时间 */ @TableField("CREATE_TIME") - private Date createTime; + private LocalDateTime createTime; /** * 更新人 @@ -229,7 +230,7 @@ public class SurvTransdataOrientwater extends Model { * 更新时间 */ @TableField("UPDATED_TIME") - private Date updatedTime; + private LocalDateTime updatedTime; diff --git a/src/main/java/com/lanhai/entity/SurvTransdataSoil.java b/src/main/java/com/lanhai/entity/SurvTransdataSoil.java index be0481c..601ef82 100644 --- a/src/main/java/com/lanhai/entity/SurvTransdataSoil.java +++ b/src/main/java/com/lanhai/entity/SurvTransdataSoil.java @@ -10,6 +10,7 @@ import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import java.io.Serializable; +import java.time.LocalDateTime; import java.util.Date; /** @@ -210,7 +211,7 @@ public class SurvTransdataSoil extends Model { * 数据更新时间 */ @TableField("DATA_DATE_TIME") - private Date dataDateTime; + private LocalDateTime dataDateTime; /** * 数据类型;realTime=实时,dayTime=日数据,month=月数据,year=年数据 @@ -289,7 +290,7 @@ public class SurvTransdataSoil extends Model { * 创建时间 */ @TableField("CREATE_TIME") - private Date createTime; + private LocalDateTime createTime; /** * 更新人 @@ -307,7 +308,7 @@ public class SurvTransdataSoil extends Model { * 更新时间 */ @TableField("UPDATED_TIME") - private Date updatedTime; + private LocalDateTime updatedTime; /** * 更新时间 diff --git a/src/main/java/com/lanhai/o/iot/renke/RenkeDataRealTimeDetail.java b/src/main/java/com/lanhai/o/iot/renke/RenkeDataRealTimeDetail.java index 59fe43e..3c96e81 100644 --- a/src/main/java/com/lanhai/o/iot/renke/RenkeDataRealTimeDetail.java +++ b/src/main/java/com/lanhai/o/iot/renke/RenkeDataRealTimeDetail.java @@ -13,7 +13,7 @@ import java.util.List; public class RenkeDataRealTimeDetail { private String systemCode; - private long deviceAddr; + private Long deviceAddr; private String deviceName; private int lat; private int lng; @@ -21,7 +21,7 @@ public class RenkeDataRealTimeDetail { private String relayStatus; private List relayStatusItems; private List dataItem; - private long timeStamp; + private Long timeStamp; public void setSystemCode(String systemCode) { this.systemCode = systemCode; } @@ -29,10 +29,10 @@ public class RenkeDataRealTimeDetail { return systemCode; } - public void setDeviceAddr(long deviceAddr) { + public void setDeviceAddr(Long deviceAddr) { this.deviceAddr = deviceAddr; } - public long getDeviceAddr() { + public Long getDeviceAddr() { return deviceAddr; } @@ -85,10 +85,10 @@ public class RenkeDataRealTimeDetail { return dataItem; } - public void setTimeStamp(long timeStamp) { + public void setTimeStamp(Long timeStamp) { this.timeStamp = timeStamp; } - public long getTimeStamp() { + public Long getTimeStamp() { return timeStamp; } diff --git a/src/main/java/com/lanhai/service/Impl/CommonServiceImpl.java b/src/main/java/com/lanhai/service/Impl/CommonServiceImpl.java index e7e3ad2..d0dd4d2 100644 --- a/src/main/java/com/lanhai/service/Impl/CommonServiceImpl.java +++ b/src/main/java/com/lanhai/service/Impl/CommonServiceImpl.java @@ -17,6 +17,7 @@ import org.springframework.cache.annotation.Cacheable; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +import java.time.LocalDateTime; import java.util.Date; import java.util.List; @@ -121,6 +122,7 @@ public class CommonServiceImpl implements ICommonService { break; } if(waterCommonTransVo!=null){ + LocalDateTime nowTime =LocalDateTime.now(); //遍历保存所有租户数据 for (SurvDeviceDeploy deploy : deployList) { SurvStationInfo survStationInfo = survStationInfoService.getByCode(deploy.getStationCode()); @@ -135,14 +137,14 @@ public class CommonServiceImpl implements ICommonService { orientwater.setDeviceName(deploy.getDeployDes()); orientwater.setDeviceId(deploy.getId()); orientwater.setCreatedBy("task");//创建人 - orientwater.setCreateTime(new Date());//创建时间 + orientwater.setCreateTime(nowTime);//创建时间 transdataOrientwaterService.save(orientwater); //保存历史表 SurvHisdataOrientwater hisOrientWater= new SurvHisdataOrientwater(); hisOrientWater.setId(IdUtil.getSnowflakeNextIdStr()); - hisOrientWater.setTransDate(new Date()); + hisOrientWater.setTransDate(nowTime); hisdataOrientwaterService.save(hisOrientWater); } else if (PollutionConstants.WATER_LIVE.equals(deploy.getDeployType())) { @@ -155,14 +157,14 @@ public class CommonServiceImpl implements ICommonService { livestockwater.setDeviceName(deploy.getDeployDes()); livestockwater.setDeviceId(deploy.getId()); livestockwater.setCreatedBy("task");//创建人 - livestockwater.setCreateTime(new Date());//创建时间 + livestockwater.setCreateTime(nowTime);//创建时间 transdataLivestockwaterService.save(livestockwater); //保存历史表 SurvHisdataLivestockwater hisdataLivestockwater = new SurvHisdataLivestockwater(); hisdataLivestockwater.setId(IdUtil.getSnowflakeNextIdStr()); - hisdataLivestockwater.setTransDate(new Date()); + hisdataLivestockwater.setTransDate(nowTime); hisdataLivestockwaterService.save(hisdataLivestockwater); } diff --git a/src/main/java/com/lanhai/service/Impl/SurvHisdataLivestockwaterServiceImpl.java b/src/main/java/com/lanhai/service/Impl/SurvHisdataLivestockwaterServiceImpl.java index 7d6e135..1d8d4bd 100644 --- a/src/main/java/com/lanhai/service/Impl/SurvHisdataLivestockwaterServiceImpl.java +++ b/src/main/java/com/lanhai/service/Impl/SurvHisdataLivestockwaterServiceImpl.java @@ -97,7 +97,7 @@ public class SurvHisdataLivestockwaterServiceImpl extends ServiceImpl dataExamineDetail.getHistoryRange()) {//最新数据已经超过时限范围,则使用预设数据 XxlJobHelper.log("xxxx使用预设数据xxxxx"); @@ -271,7 +271,7 @@ public class SurvHisdataLivestockwaterServiceImpl extends ServiceImpl config.getHistoryRange()) {//最新数据已经超过时限范围,则使用预设数据 XxlJobHelper.log("xxxx使用预设数据xxxxx"); @@ -291,7 +291,7 @@ public class SurvHisdataOrientwaterServiceImpl extends ServiceImpl config.getHistoryRange()) {//最新数据已经超过时限范围,则使用预设数据 XxlJobHelper.log("xxxx使用预设数据xxxxx"); @@ -99,7 +97,7 @@ public class SurvHisdataSoilServiceImpl extends ServiceImpl baowenMap = new HashMap(); baowenMap.put("mn", transdataLivestockwater.getDeployCode()); diff --git a/src/main/java/com/lanhai/service/Impl/SurvTransdataOrientwaterServiceImpl.java b/src/main/java/com/lanhai/service/Impl/SurvTransdataOrientwaterServiceImpl.java index 6857750..e968140 100644 --- a/src/main/java/com/lanhai/service/Impl/SurvTransdataOrientwaterServiceImpl.java +++ b/src/main/java/com/lanhai/service/Impl/SurvTransdataOrientwaterServiceImpl.java @@ -20,6 +20,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDateTime; import java.util.Date; import java.util.HashMap; import java.util.Map; @@ -70,7 +71,7 @@ public class SurvTransdataOrientwaterServiceImpl extends ServiceImpl baowenMap = new HashMap(); baowenMap.put("mn", transdataOrientwater.getDeployCode()); diff --git a/src/main/java/com/lanhai/service/Impl/SurvTransdataSoilServiceImpl.java b/src/main/java/com/lanhai/service/Impl/SurvTransdataSoilServiceImpl.java index 97ebaa0..8ba4282 100644 --- a/src/main/java/com/lanhai/service/Impl/SurvTransdataSoilServiceImpl.java +++ b/src/main/java/com/lanhai/service/Impl/SurvTransdataSoilServiceImpl.java @@ -10,6 +10,7 @@ import com.lanhai.entity.*; import com.lanhai.enums.DeviceDeployEnum; import com.lanhai.mapper.SurvTransdataSoilMapper; import com.lanhai.service.*; +import com.lanhai.util.DateTimeUtils; import com.lanhai.util.TUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -17,6 +18,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDateTime; import java.util.Date; import java.util.Map; @@ -68,8 +70,8 @@ public class SurvTransdataSoilServiceImpl extends ServiceImpl 0){//只有数据有效时才入库 - soil.setDataDateTime(DateUtil.parse(DataTime));//数据时间 + soil.setDataDateTime(DateTimeUtils.parse(DataTime));//数据时间 soil.setDataGatherType("realTime");//数据类型-realTime=实时,dayTime=日数据,month=月数据,year=年数据 soil.setDeployCode(mn);//设备编号 soil.setTenantId(survDeviceDeploy.getTenantId()); @@ -128,7 +130,6 @@ public class SurvTransdataSoilServiceImpl extends ServiceImpl() @@ -153,7 +154,7 @@ public class SurvTransdataSoilServiceImpl extends ServiceImpl 0) {//只有数据有效时才入库 - air.setDataDateTime(DateUtil.parse(DataTime));//数据时间 + air.setDataDateTime(DateTimeUtils.parse(DataTime));//数据时间 air.setDataGatherType("realTime");//数据类型-realTime=实时,dayTime=日数据,month=月数据,year=年数据 air.setDeployCode(mn);//设备编号 air.setTenantId(survDeviceDeploy.getTenantId()); @@ -217,8 +218,9 @@ public class SurvTransdataSoilServiceImpl extends ServiceImpl0 ){ - soil.setDataDateTime(DateUtil.parse(DataTime));//数据时间 + soil.setDataDateTime(DateTimeUtils.parse(DataTime));//数据时间 soil.setDataGatherType("realTime");//数据类型-realTime=实时,dayTime=日数据,month=月数据,year=年数据 soil.setDeployCode(mn);//设备编号 soil.setTenantId(deploy.getTenantId()); @@ -318,7 +320,7 @@ public class SurvTransdataSoilServiceImpl extends ServiceImpl 0) { - air.setDataDateTime(DateUtil.parse(DataTime));//数据时间 + air.setDataDateTime(DateTimeUtils.parse(DataTime));//数据时间 air.setDataGatherType("realTime");//数据类型-realTime=实时,dayTime=日数据,month=月数据,year=年数据 air.setDeployCode(mn);//设备编号 air.setTenantId(deploy.getTenantId()); diff --git a/src/main/java/com/lanhai/util/DataUtil.java b/src/main/java/com/lanhai/util/DataUtil.java index 0a10742..ef3323c 100644 --- a/src/main/java/com/lanhai/util/DataUtil.java +++ b/src/main/java/com/lanhai/util/DataUtil.java @@ -16,6 +16,7 @@ import org.apache.commons.lang3.StringUtils; import java.math.BigDecimal; import java.math.RoundingMode; +import java.time.LocalDateTime; import java.util.Date; import java.util.HashMap; import java.util.Map; @@ -108,7 +109,7 @@ public class DataUtil{ public static SurvTransdataOrientwater strToOrientwater(String str) { SurvTransdataOrientwater orientwater = new SurvTransdataOrientwater(); - orientwater.setDataDateTime(new Date()); + orientwater.setDataDateTime(LocalDateTime.now()); orientwater.setDataGatherType("realTime"); orientwater.setDeployCode(CommonConstant.XZP_WATER +str.substring(2,4));// @@ -140,7 +141,7 @@ public class DataUtil{ public static SurvTransdataLivestockwater strToLivewater(String str) { SurvTransdataLivestockwater livestockwater = new SurvTransdataLivestockwater(); - livestockwater.setDataDateTime(new Date()); + livestockwater.setDataDateTime(LocalDateTime.now()); livestockwater.setDataGatherType("realTime"); livestockwater.setDeployCode(CommonConstant.XZP_WATER +str.substring(2,4));// diff --git a/src/main/java/com/lanhai/util/DateTimeUtils.java b/src/main/java/com/lanhai/util/DateTimeUtils.java new file mode 100644 index 0000000..1eafb57 --- /dev/null +++ b/src/main/java/com/lanhai/util/DateTimeUtils.java @@ -0,0 +1,318 @@ +package com.lanhai.util; + +import java.time.LocalDateTime; +import java.time.Duration; +import java.time.Period; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.List; + +/** + * 日期时间工具类 - 计算两个LocalDateTime之间的时间差 + */ +public class DateTimeUtils { + + /** + * 1. 基础用法:获取总秒数差 + */ + public static long getSecondsDiff(LocalDateTime start, LocalDateTime end) { + validateParams(start, end); + return Duration.between(start, end).getSeconds(); + } + + /** + * 2. 获取总毫秒数差 + */ + public static long getMillisDiff(LocalDateTime start, LocalDateTime end) { + validateParams(start, end); + return Duration.between(start, end).toMillis(); + } + + /** + * 3. 获取总分钟数差 + */ + public static long getMinutesDiff(LocalDateTime start, LocalDateTime end) { + validateParams(start, end); + return Duration.between(start, end).toMinutes(); + } + + /** + * 4. 获取总小时数差 + */ + public static long getHoursDiff(LocalDateTime start, LocalDateTime end) { + validateParams(start, end); + return Duration.between(start, end).toHours(); + } + + /** + * 5. 获取总天数差 + */ + public static long getDaysDiff(LocalDateTime start, LocalDateTime end) { + validateParams(start, end); + return Duration.between(start, end).toDays(); + } + + /** + * 6. 使用ChronoUnit获取指定单位的时间差 + */ + public static long getDiff(LocalDateTime start, LocalDateTime end, ChronoUnit unit) { + validateParams(start, end); + return unit.between(start, end); + } + + /** + * 7. 获取详细的时间差(天、小时、分钟、秒) + */ + public static TimeDiff getDetailedDiff(LocalDateTime start, LocalDateTime end) { + validateParams(start, end); + + Duration duration = Duration.between(start, end); + long absSeconds = Math.abs(duration.getSeconds()); + + long days = absSeconds / (24 * 3600); + long hours = (absSeconds % (24 * 3600)) / 3600; + long minutes = (absSeconds % 3600) / 60; + long seconds = absSeconds % 60; + long millis = Math.abs(duration.getNano()) / 1_000_000; + + return new TimeDiff(days, hours, minutes, seconds, millis, duration.isNegative()); + } + + /** + * 8. 获取可读的时间差字符串(如:2天3小时5分钟) + */ + public static String getReadableDiff(LocalDateTime start, LocalDateTime end) { + TimeDiff diff = getDetailedDiff(start, end); + + List parts = new ArrayList<>(); + if (diff.getDays() > 0) { + parts.add(diff.getDays() + "天"); + } + if (diff.getHours() > 0) { + parts.add(diff.getHours() + "小时"); + } + if (diff.getMinutes() > 0) { + parts.add(diff.getMinutes() + "分钟"); + } + if (diff.getSeconds() > 0 || parts.isEmpty()) { + parts.add(diff.getSeconds() + "秒"); + } + if (diff.getMillis() > 0) { + parts.add(diff.getMillis() + "毫秒"); + } + + String result = String.join("", parts); + return diff.isNegative() ? "-" + result : result; + } + + /** + * 9. 判断两个时间是否在指定秒数内 + */ + public static boolean isWithinSeconds(LocalDateTime start, LocalDateTime end, long seconds) { + return Math.abs(getSecondsDiff(start, end)) <= seconds; + } + + /** + * 10. 计算年龄(基于生日) + */ + public static int getAge(LocalDateTime birthday) { + if (birthday == null) { + throw new IllegalArgumentException("生日不能为null"); + } + return Period.between(birthday.toLocalDate(), LocalDateTime.now().toLocalDate()).getYears(); + } + + /** + * 参数校验 + */ + private static void validateParams(LocalDateTime start, LocalDateTime end) { + if (start == null || end == null) { + throw new IllegalArgumentException("开始时间和结束时间不能为null"); + } + } + + /** + * 时间差详情内部类 + */ + public static class TimeDiff { + private final long days; + private final long hours; + private final long minutes; + private final long seconds; + private final long millis; + private final boolean negative; + + public TimeDiff(long days, long hours, long minutes, long seconds, long millis, boolean negative) { + this.days = days; + this.hours = hours; + this.minutes = minutes; + this.seconds = seconds; + this.millis = millis; + this.negative = negative; + } + + // Getters + public long getDays() { return days; } + public long getHours() { return hours; } + public long getMinutes() { return minutes; } + public long getSeconds() { return seconds; } + public long getMillis() { return millis; } + public boolean isNegative() { return negative; } + + @Override + public String toString() { + return String.format("%d天%d小时%d分钟%d秒%d毫秒%s", + days, hours, minutes, seconds, millis, negative ? " (负值)" : ""); + } + } + + + // ==================== 字符串解析方法 ==================== + + /** + * 1.1 使用默认格式解析字符串为LocalDateTime + * 默认格式:yyyy-MM-dd HH:mm:ss + */ + public static LocalDateTime parse(String dateTimeStr) { + return parse(dateTimeStr, "yyyy-MM-dd HH:mm:ss"); + } + + /** + * 1.2 使用指定格式解析字符串为LocalDateTime + * @param dateTimeStr 日期时间字符串 + * @param pattern 格式,如:yyyy/MM/dd HH:mm:ss + */ + public static LocalDateTime parse(String dateTimeStr, String pattern) { + if (dateTimeStr == null || dateTimeStr.trim().isEmpty()) { + throw new IllegalArgumentException("日期时间字符串不能为null或空"); + } + if (pattern == null || pattern.trim().isEmpty()) { + throw new IllegalArgumentException("日期格式不能为null或空"); + } + + try { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern); + return LocalDateTime.parse(dateTimeStr, formatter); + } catch (DateTimeParseException e) { + throw new IllegalArgumentException("字符串解析失败: " + dateTimeStr + ",格式: " + pattern, e); + } + } + + /** + * 1.3 解析ISO格式字符串(默认被LocalDateTime.parse支持) + * 支持格式:2007-12-03T10:15:30 + */ + public static LocalDateTime parseIso(String dateTimeStr) { + if (dateTimeStr == null || dateTimeStr.trim().isEmpty()) { + throw new IllegalArgumentException("日期时间字符串不能为null或空"); + } + try { + return LocalDateTime.parse(dateTimeStr); + } catch (DateTimeParseException e) { + throw new IllegalArgumentException("ISO格式字符串解析失败: " + dateTimeStr, e); + } + } + + /** + * 1.4 解析带时区的字符串(自动处理时区) + * 支持格式:2024-01-01T10:15:30+08:00 + */ + public static LocalDateTime parseWithZone(String dateTimeStr) { + if (dateTimeStr == null || dateTimeStr.trim().isEmpty()) { + throw new IllegalArgumentException("日期时间字符串不能为null或空"); + } + try { + // 使用ISO带时区的格式解析,然后转换为LocalDateTime(去掉时区) + return java.time.ZonedDateTime.parse(dateTimeStr) + .toLocalDateTime(); + } catch (DateTimeParseException e) { + throw new IllegalArgumentException("带时区字符串解析失败: " + dateTimeStr, e); + } + } + + /** + * 1.5 解析常见格式(自动识别多种格式) + * 支持的格式: + * - yyyy-MM-dd HH:mm:ss + * - yyyy/MM/dd HH:mm:ss + * - yyyy-MM-dd HH:mm + * - yyyy/MM/dd HH:mm + * - yyyy-MM-dd + * - yyyy/MM/dd + */ + public static LocalDateTime parseAuto(String dateTimeStr) { + if (dateTimeStr == null || dateTimeStr.trim().isEmpty()) { + throw new IllegalArgumentException("日期时间字符串不能为null或空"); + } + + String trimmed = dateTimeStr.trim(); + + // 尝试多种格式 + String[] patterns = { + "yyyy-MM-dd HH:mm:ss", + "yyyy/MM/dd HH:mm:ss", + "yyyy-MM-dd HH:mm", + "yyyy/MM/dd HH:mm", + "yyyy-MM-dd", + "yyyy/MM/dd" + }; + + for (String pattern : patterns) { + try { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern); + LocalDateTime result = LocalDateTime.parse(trimmed, formatter); + // 如果格式是日期(没有时间),默认加上00:00:00 + if (!pattern.contains("HH")) { + return result; + } + return result; + } catch (DateTimeParseException ignored) { + // 继续尝试下一种格式 + } + } + + throw new IllegalArgumentException("无法自动解析日期时间字符串: " + dateTimeStr); + } + + /** + * 1.6 解析时间戳(毫秒) + */ + public static LocalDateTime parseTimestamp(long timestamp) { + return java.time.Instant.ofEpochMilli(timestamp) + .atZone(java.time.ZoneId.systemDefault()) + .toLocalDateTime(); + } + + /** + * 1.7 解析时间戳(秒) + */ + public static LocalDateTime parseSeconds(long seconds) { + return java.time.Instant.ofEpochSecond(seconds) + .atZone(java.time.ZoneId.systemDefault()) + .toLocalDateTime(); + } + + /** + * 1.8 安全解析(解析失败返回null) + */ + public static LocalDateTime parseQuietly(String dateTimeStr, String pattern) { + try { + return parse(dateTimeStr, pattern); + } catch (Exception e) { + return null; + } + } + + /** + * 1.9 安全解析(解析失败返回默认值) + */ + public static LocalDateTime parseOrDefault(String dateTimeStr, String pattern, LocalDateTime defaultValue) { + try { + return parse(dateTimeStr, pattern); + } catch (Exception e) { + return defaultValue; + } + } +} diff --git a/src/main/java/com/lanhai/util/SdrkUtils.java b/src/main/java/com/lanhai/util/SdrkUtils.java index 5a1f1a7..8ca57df 100644 --- a/src/main/java/com/lanhai/util/SdrkUtils.java +++ b/src/main/java/com/lanhai/util/SdrkUtils.java @@ -77,6 +77,10 @@ public class SdrkUtils { dataMap.put("mn",deploy.getDeployCode()); DateTimeFormatter sdf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); for (RenkeDataRealTimeDetail realTimeDetail : datas) { + if(realTimeDetail.getTimeStamp() == null || realTimeDetail.getTimeStamp().equals(0L)){ + log.error("=======跳过仁科无效数据,设备号:{}-{},时间戳为:{}==========",deploy.getId(),deploy.getDeployCode(),realTimeDetail.getTimeStamp()); + continue; + } LocalDateTime dateTime = Instant.ofEpochMilli(realTimeDetail.getTimeStamp()) .atZone(ZoneId.systemDefault()) // 使用系统默认时区 .toLocalDateTime(); @@ -92,7 +96,9 @@ public class SdrkUtils { } } } - survTransdataSoilService.saveBaowen(dataMap, deploy,deviceDeployMap); + if(dataMap.size()>1){//不值包含mn + survTransdataSoilService.saveBaowen(dataMap, deploy,deviceDeployMap); + } } }