diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/LocalDateTimeUtils.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/LocalDateTimeUtils.java index b2fd55f..f942d6e 100644 --- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/LocalDateTimeUtils.java +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/LocalDateTimeUtils.java @@ -3,7 +3,6 @@ package cn.iocoder.yudao.framework.common.util.date; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.LocalDateTimeUtil; -import cn.hutool.core.date.TemporalAccessorUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.enums.DateIntervalEnum; @@ -16,6 +15,7 @@ import java.time.temporal.ChronoUnit; import java.time.temporal.TemporalAdjusters; import java.util.ArrayList; import java.util.List; +import java.util.TimeZone; import static cn.hutool.core.date.DatePattern.*; @@ -34,6 +34,11 @@ public class LocalDateTimeUtils { public static DateTimeFormatter UTC_MS_WITH_XXX_OFFSET_FORMATTER = createFormatter(UTC_MS_WITH_XXX_OFFSET_PATTERN); /** + * 默认时区 + */ + private static final ZoneId DEFAULT_ZONE_ID = TimeZone.getTimeZone(DateUtils.TIME_ZONE_DEFAULT).toZoneId(); + + /** * 解析时间 * * 相比 {@link LocalDateTimeUtil#parse(CharSequence)} 方法来说,会尽量去解析,直到成功 @@ -66,6 +71,27 @@ public class LocalDateTimeUtils { } /** + * 将 Unix 秒时间戳转换为默认时区的本地时间 + * + * @param epochSecond Unix 秒时间戳 + * @return 本地时间 + */ + public static LocalDateTime ofEpochSecond(long epochSecond) { + return ofEpochSecond(epochSecond, DEFAULT_ZONE_ID); + } + + /** + * 将 Unix 秒时间戳转换为指定时区的本地时间 + * + * @param epochSecond Unix 秒时间戳 + * @param zoneId 时区编号 + * @return 本地时间 + */ + public static LocalDateTime ofEpochSecond(long epochSecond, ZoneId zoneId) { + return LocalDateTime.ofInstant(Instant.ofEpochSecond(epochSecond), zoneId); + } + + /** * 创建指定时间 * * @param year 年 @@ -393,7 +419,18 @@ public class LocalDateTimeUtils { * @throws DateTimeException 如果转换过程中发生时间超出范围或其他时间处理异常 */ public static Long toEpochSecond(LocalDateTime sourceDateTime) { - return TemporalAccessorUtil.toInstant(sourceDateTime).getEpochSecond(); + return toEpochSecond(sourceDateTime, DEFAULT_ZONE_ID); + } + + /** + * 将给定的 {@link LocalDateTime} 按指定时区转换为自 Unix 纪元时间(1970-01-01T00:00:00Z)以来的秒数。 + * + * @param sourceDateTime 需要转换的本地日期时间,不能为空 + * @param zoneId 时区编号 + * @return 自 1970-01-01T00:00:00Z 起的秒数(epoch second) + */ + public static Long toEpochSecond(LocalDateTime sourceDateTime, ZoneId zoneId) { + return sourceDateTime.atZone(zoneId).toEpochSecond(); } } diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/scene/IotSceneRuleTimeHelper.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/scene/IotSceneRuleTimeHelper.java index 01ddd57..238e030 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/scene/IotSceneRuleTimeHelper.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/rule/scene/IotSceneRuleTimeHelper.java @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.iot.service.rule.scene; import cn.hutool.core.lang.Assert; import cn.hutool.core.text.CharPool; import cn.hutool.core.util.StrUtil; +import cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils; import cn.iocoder.yudao.module.iot.enums.rule.IotSceneRuleConditionOperatorEnum; import cn.iocoder.yudao.module.iot.service.rule.scene.matcher.condition.IotCurrentTimeConditionMatcher; import cn.iocoder.yudao.module.iot.service.rule.scene.timer.IotTimerConditionEvaluator; @@ -11,7 +12,6 @@ import lombok.extern.slf4j.Slf4j; import java.time.LocalDateTime; import java.time.LocalTime; -import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.List; @@ -73,7 +73,7 @@ public class IotSceneRuleTimeHelper { LocalDateTime now = LocalDateTime.now(); if (isDateTimeOperator(operatorEnum)) { // 日期时间匹配(时间戳,秒级) - long currentTimestamp = now.atZone(ZoneId.systemDefault()).toEpochSecond(); + long currentTimestamp = LocalDateTimeUtils.toEpochSecond(now); return matchDateTime(currentTimestamp, operatorEnum, param); } else { // 当日时间匹配(HH:mm:ss) diff --git a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/framework/sms/core/client/impl/QiniuSmsClient.java b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/framework/sms/core/client/impl/QiniuSmsClient.java index 41ba95b..500b3ed 100644 --- a/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/framework/sms/core/client/impl/QiniuSmsClient.java +++ b/yudao-module-system/src/main/java/cn/iocoder/yudao/module/system/framework/sms/core/client/impl/QiniuSmsClient.java @@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.system.framework.sms.core.client.impl; import cn.hutool.core.collection.CollStreamUtil; import cn.hutool.core.date.DateUtil; -import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ObjectUtil; import cn.hutool.crypto.SecureUtil; @@ -10,6 +9,7 @@ import cn.hutool.crypto.digest.HmacAlgorithm; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import cn.iocoder.yudao.framework.common.core.KeyValue; +import cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils; import cn.iocoder.yudao.framework.common.util.http.HttpUtils; import cn.iocoder.yudao.module.system.framework.sms.core.client.dto.SmsReceiveRespDTO; import cn.iocoder.yudao.module.system.framework.sms.core.client.dto.SmsSendRespDTO; @@ -120,7 +120,7 @@ public class QiniuSmsClient extends AbstractSmsClient { .setSuccess("DELIVRD".equals(statusObj.getStr("status"))) // 是否接收成功 .setErrorMsg(statusObj.getStr("status")) // 状态报告编码 .setMobile(statusObj.getStr("mobile")) // 手机号 - .setReceiveTime(LocalDateTimeUtil.of(statusObj.getLong("delivrd_at") * 1000L)) // 状态报告时间 + .setReceiveTime(LocalDateTimeUtils.ofEpochSecond(statusObj.getLong("delivrd_at"))) // 状态报告时间 .setSerialNo(statusObj.getStr("message_id")) // 发送序列号 .setLogId(statusObj.getLong("seq")); // 用户序列号 }