1.问题描述
nacos配置的时间起止时间分别是2023-06-01 00:00:00和2023-06-15 23:59:59(图1所示),但是打印出的日志时间如图2所示,两者差了8个小时
图1
图2
MarginAccountModel marginAccountModel = marginAccountDAO.queryById(request.getMarginAccountId());
CalculateGivingAmtPOJO calculateGivingAmtPOJO = new CalculateGivingAmtPOJO();
String activityStartTime = rechargeGivingActivityProperties.getStartTime();
String activityEndTime = rechargeGivingActivityProperties.getEndTime();
Integer activityStatus = rechargeGivingActivityProperties.getStatus();
BigDecimal rechargeAmt = request.getRechargeAmt();
//判断活动是否结束
long startTime = DateUtils.glTimeToTimestamp(activityStartTime).getTime();
long endTime = DateUtils.glTimeToTimestamp(activityEndTime).getTime();
log.info("赠送的开始时间是:{},结束时间是:{}", activityStartTime, activityEndTime);
/**
* @param time
* @desc 格林时间格式转化
* @example time="Tue Jul 13 08:00:00 CST 2021"
**/
public static Date glTimeToTimestamp(String time) {
Date parse = null;
try {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US);
parse = simpleDateFormat.parse(time);
} catch (Exception e) {
e.printStackTrace();
}
return parse;
}
2.原因分析
不带引号的时间字符串在计算机中被解释为GMT时间(即UTC时间),而不是本地时间。因此,无论你在哪个时区,计算机都会将其解读为GMT时间,并在必要时将其转换为本地时间。这是因为计算机系统中的时间通常以UTC的形式进行存储和处理,而不是以本地时间的形式进行处理。因此,如果你使用不带引号的时间字符串,它将自动被解释为GMT时间。
修正后,图3的配置和图4的日志就能够对应上
图3
图4
修正后的相应代码
MarginAccountModel marginAccountModel = marginAccountDAO.queryById(request.getMarginAccountId());
CalculateGivingAmtPOJO calculateGivingAmtPOJO = new CalculateGivingAmtPOJO();
String activityStartTime = rechargeGivingActivityProperties.getStartTime();
String activityEndTime = rechargeGivingActivityProperties.getEndTime();
Integer activityStatus = rechargeGivingActivityProperties.getStatus();
BigDecimal rechargeAmt = request.getRechargeAmt();
//判断活动是否结束
long startTime = DateUtils.getTimestamp(activityStartTime);
long endTime = DateUtils.getTimestamp(activityEndTime);
log.info("赠送的开始时间是:{},结束时间是:{}", activityStartTime, activityEndTime);
/**
* @param time
* @desc 字符串转时间戳
* @example time="2019-04-19 00:00:00"
**/
public static Long getTimestamp(String time) {
Long timestamp = null;
try {
timestamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(time).getTime();
} catch (Exception e) {
log.error("解析时间异常,异常信息为 {}, e= {}",e.getMessage(),e);
}
return timestamp;
}