HOUR_OF_DAY: 2 -> 3问题总结

科普小知识:时区小知识

问题描述

生产连续多天归档失败,查看日志发现报错如下图
在这里插入图片描述

问题复现

  1. 将有问题的数据导入测试环境执行归档,未复现
  2. 观察日志发现执行归档使用的mysql驱动为weblogic自带的mysql-connector-java-commercial-8.0.14.jar,并不是我们指定的mysql-connector-java-5.1.46.jar
  3. 本地改为mysql-connector-java-commercial-8.0.14.jar进行测试,复现问题
  4. 将驱动包升级为mysql-connector-java-8.0.23.jar进行测试,未复现

问题疑点

  1. 为什么使用的是weblogic自带的mysql驱动包
  2. 对于同样的数据mysql-connector-java-5.1.46.jar,mysql-connector-java-commercial-8.0.14.jar,mysql-connector-java-8.0.23.jar为什么执行结果不一样
  3. 本地使用weblogic自带的mysql-connector-java-commercial-8.0.14.jar执行查询语句后获取DATE_START字段内容时,复现问题,同生产报错一 致,分析1000条数据中哪些数据有问题,发现1000条数据对应的时区都一样,但是2021-03-14 02:00:00到2021-03-14 02:59:59这一个小时内的 数据会报错,其他数据正常

问题解答

  1. 为什么使用的是weblogic自带的mysql驱动包
    我们在setDomain.sh中指定了mysql驱动,但是中间有空格,导致该问题发生,可以在启动参数中增加 -verbose:class查看类加载过程
    正确配置为
    在这里插入图片描述

  2. 对于同样的数据mysql-connector-java-5.1.46.jar,mysql-connector-java-commercial-8.0.14.jar,mysql-connector-java-8.0.23.jar为什么执行结果不一样
    a. mysql-connector-java-5.1.46.jar获取到的时区为应用系统时区

    sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false, transitions=29,lastRule=null]
    

    获取日期类型结果
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    未进行时区转换,直接return

    b. mysql-connector-java-commercial-8.0.14.jar获取到的是服务器端的时区,而服务器端的时区为CST
    在这里插入图片描述

    c. mysql-connector-java-8.0.23.jar

  3. 本地使用weblogic自带的mysql-connector-java-commercial-8.0.14.jar执行查询语句后获取DATE_START字段内容时,复现问题,同生产报错一 致,分析1000条数据中哪些数据有问题,发现1000条数据对应的时区都一样,但是2021-03-14 02:00:00到2021-03-14 02:59:59这一个小时内的 数据会报错,其他数据正常
    答:2021年美国夏令时将于当地时间3月14日(周日)凌晨2:00am开始,于11月7日(周日)凌晨2:00am结束。因此在3月14日凌晨2:00am将时钟调快1小时,时钟调到3点,因此GregorianCalendar.computeTime()在计算时间时HOUR_OF_DAY实际是2但是计算后值为3,两个不相符,因此报HOUR_OF_DAY: 2 -> 3

问题解决

方式一:在使用mysql-connector-java-8.x.x.jar时url后增加时区配置,例如:spring.datasource.url=jdbc:mysql://1.1.1.1:3306/xxx?serverTimezone=Asia/Shanghai
方式二:配置指定可用驱动包

这里面的编码:“ self.node_feat_encoder = nn.Sequential( nn.Linear(time_steps, 16), # 将14个时间步编码为特征 nn.ReLU(), nn.Linear(16, node_feat_dim) )”可以换成正余弦编码吗?数据在输入进去的时候,第一列是时间,请帮我加入正余弦编码:“class TimeCovariates(object): """Extract all time covariates except for holidays.""" def __init__( self, datetimes, normalized = True ): """Init function. Args: datetimes: pandas DatetimeIndex (lowest granularity supported is min) normalized: whether to normalize features or not holiday: fetch holiday features or not Returns: None """ self.normalized = normalized self.dti = datetimes def _minute_of_hour(self): minutes = np.array(self.dti.minute, dtype=np.float32) if self.normalized: minutes = minutes / 59.0 - 0.5 return minutes def _hour_of_day(self): hours = np.array(self.dti.hour, dtype=np.float32) if self.normalized: hours = hours / 23.0 - 0.5 return hours def _day_of_week(self): day_week = np.array(self.dti.dayofweek, dtype=np.float32) if self.normalized: day_week = day_week / 6.0 - 0.5 return day_week def _day_of_month(self): day_month = np.array(self.dti.day, dtype=np.float32) if self.normalized: day_month = day_month / 30.0 - 0.5 return day_month def _day_of_year(self): day_year = np.array(self.dti.dayofyear, dtype=np.float32) if self.normalized: day_year = day_year / 364.0 - 0.5 return day_year def _month_of_year(self): month_year = np.array(self.dti.month, dtype=np.float32) if self.normalized: month_year = month_year / 11.0 - 0.5 return month_year def _week_of_year(self): week_year = np.array(self.dti.strftime("%U").astype(int), dtype=np.float32) if self.normalized: week_year = week_year / 51.0 - 0.5 return week_year def get_covariates(self): """Get all time covariates.""" moh = self._minute_of_hour().reshape(1, -1) hod = self._hour_of_day().reshape(1, -1) dom = self._day_of_month().reshape(1, -1) dow = self._day_of_week().reshape(1, -1) doy = self._day_of_year().reshape(1, -1) moy = self._month_of_year().reshape(1, -1) woy = self._week_of_year().reshape(1, -1) all_covs = [ moh, hod, dom, dow, doy, moy, woy, ] columns = ["moh", "hod", "dom", "dow", "doy", "moy", "woy"] return pd.DataFrame( data=np.vstack(all_covs).transpose(), columns=columns, index=self.dti, )”并帮我分析一下这样是否能够提升预测精度?
最新发布
04-06
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值