服务器时区与数据库时区不一致导致时间bug记录

1、背景

 一个活动,需要按照自然月刷新,每月一期,以活动开始当月作为第一期,每期可配置不同数据。问题出现在:活动开始时间为本月,但是查询用户数据发现当前为第二期,反复查看代码,确定计算期数逻辑无问题,十分诡异。期数计算代码如下:

protected int getPeriod(Date begin, Date now) {// DateUtil为工具类,format方法将时间转化为 yyyy-MM-dd格式String beginTime = DateUtil.format(begin, DateUtil.FORMATTER_YYYYMMDD_STR);String nowTime = DateUtil.format(now, DateUtil.FORMATTER_YYYYMMDD_STR);int beginYear = Integer.valueOf(beginTime.substring(0, 4));int nowYear = Integer.valueOf(nowTime.substring(0, 4));int beginMonth = (beginTime.charAt(5) - '0') * 10 + (beginTime.charAt(6) - '0');int nowMonth = (nowTime.charAt(5) - '0') * 10 + (nowTime.charAt(6) - '0');// 计算期数(可能出现跨年,需要考虑年份)return nowMonth + 12 * (nowYear - beginYear) - beginMonth + 1;}

2、排查

 服务为分布式架构,有多个节点,发现只有少数节点会产生异常数据(本次活动只配置了一期,计算结果为第二期时会因拿不到配置数据而空指针,根据报错日志判断)。查看配置数据,发现活动开始时间为本月1日00点00分00秒,因此数个小时的时差即会导致月份出现偏差,猜测服务器时区问题,date -R检查服务器时区,正常节点与异常节点时区一致,暂时不考虑时区问题。
 配置数据会加载进内存,当修改配置数据时,会修改有改动表的版本号,定时任务根据表版本号去刷新配置。考虑是配置人员中途改过数据,定时任务出现问题导致配置没有更新。观察日志,发现刷新配置的时间异常,时区与机器时区不一致。
 date -R 结果(+0900 东九区):

Wed, 12 Jun 2024 22:59:25 +0900

 服务器日志时间:

2024-06-12T01:17:22.506+0000

3、结论

 出现错误的原因为:进程时区与数据库时区没有保持一致,导致进程内时间与实际要配置的时间出现偏差,最终导致计算出错。

4、总结

 (1)临界点时间(跨天、跨月、跨年)极易受时区影响导致极大误差,出现时间问题时可第一时间查看时区问题
 (2)机器时区与进程时区并不总是一致,需要摆脱这个惯性思维,用其他方式(如日志)确定进程时区。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/26148.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python API自动化:提升开发效率的利器

Python API自动化:提升开发效率的利器 随着互联网的发展,API(应用程序接口)已经成为现代应用程序开发的核心部分。API允许不同的软件系统之间进行通信,使得开发者可以轻松地集成各种服务和功能。在日常开发中&#xf…

Pikachu上的CSRF以及NSSCTF上的[NISACTF 2022]bingdundun~、 [SWPUCTF 2022 新生赛]xff

目录 一、CSRF CSRF(get) login CSRF(post) CSRF Token 二、CSRF的相关知识点 (1)什么是CSRF? (2)工作原理 (3)CSRF漏洞形成的条件 1、用户要在登录状态(即浏览器保存了该…

深入了解 Dart 语言:从基础到进阶

深入了解 Dart 语言:从基础到进阶 Dart 是由 Google 开发的一种现代化编程语言,特别为构建客户端应用程序而设计,尤其是在 Flutter 框架中得到了广泛应用。本文将带你了解 Dart 的基本概念、其在 Flutter 中的应用,以及如何开始使…

别再忽视数组排序的重要性了

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一…

线稳源极跟随 线性电源前端降压

功率MOSFET线性电源涉及跟随.ms14 根本原理是Vgs对Id的控制,Vgs越大,Id越大,反之亦然。 观察转移特性曲线,结合接线图可知,电路稳定后,如果负载电阻增大,则Vsgnd增大,由于Vggnd有稳…

ONNX2NCNN工具

最近部署很多onnx转ncnn的操作,发现还是需要有页面操作会比较好,而且需要查询onnx的图,所以写了一个工具来搭配使用 建议搭配Netron 来使用 打开模型 选择打开-》选择onnx模型 显示基础信息 查询onnx模型图 展示信息 点击“展示信息”&…

力扣2594.修车的最少时间

力扣2594.修车的最少时间 二分答案 class Solution {public:long long repairCars(vector<int>& ranks, int cars) {ranges::sort(ranks);auto check [&](long long x) -> bool{long long res 0;for(auto v : ranks){long long k sqrt(x/v);res k;if(r…

vb.net小demo(计算器、文件处理等/C#也可看)

Demo1&#xff1a;使用窗体控件实现一个简易版计算器 Public Class Form1Private Sub Button_1_Click(sender As Object, e As EventArgs) Handles Button_1.ClickCalSubBox.Text Button_1.TextEnd SubPrivate Sub Button_2_Click(sender As Object, e As EventArgs) Handles …

B端系统的颜值问题:成也框架,败也框架!

B端UI框架和前端框架的出现&#xff0c;让系统的搭建就像堆积木一样&#xff0c;十分的容易了。这也一下子把程序员的设计和审美水平拔高到了UI框架能够达到的高度。伴随而来的则是系统的堆砌、同质化、糟糕的体验&#xff0c;以及各种违和的组件被生搬硬套的绑定在一块&#x…

nosql数据库的特点

NoSQL简介 NoSQL是一种不同于关系数据库的数据库管理系统设计方式,是对非关系型数据库的统称,它所采用的数据模型并非传统关系数据库的关系模型,而是类似键/值、列族、文档等非关系模型。NoSQL数据库没有固定的表结构,通常也不存在连接操作,也没有严格遵守ACID约束。因此…

前端只允许一次函数调用

如果你正在进行前端开发&#xff0c;并且只想允许一次函数调用&#xff0c;你可以使用JavaScript的闭包结构创建一个只能被调用一次的函数。这样的函数有时被称为单次调用函数&#xff08;“one-time call” functions&#xff09;或一次性函数&#xff08;“once” functions&…

网页自动关闭

将【<body 】标签内容复制到网页内容中 <!DOCTYPE html><html><head><title>自动关闭的网页</title></head><body onload"setTimeout(closePage, 5000)"><script>function closePage() {window.close();}</s…

虚拟机开启网络代理设置

前言&#xff1a; 不管是物理主机还是实验环境中的VMware虚拟机&#xff0c;有时候总要访问一些镜像网站或者资源网站拉取一些学习资料&#xff0c;但由于国内外网络环境的差异和网络安全的问题。总是会被阻拦。物理机相对比较容易一些&#xff0c;今天我们来说一说虚拟机应该…

YOLOv8模型训练参数详细解析

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

VSTO Word.net 如何在另外的工程内添加CustomTaskPane

其他工程肯定是不能直接添加CustomTaskPane面板的&#xff0c;但我们可以在ThisAddIn 中先把对应的panel给新建出来再进行隐藏。步骤如下&#xff1a; 1.在另外工程中定义public static CustomTaskPane currMainForm;把需要隐藏的界面赋值给currMainForm&#xff1b; 2.在另外…

酷暑骄阳,热情似火丨deepin校园联盟走进湖北大学,共话开源新篇章

内容来源&#xff1a;deepin&#xff08;深度&#xff09;社区 炎炎夏日&#xff0c;骄阳似火&#xff0c;6月11日&#xff0c;deepin校园联盟湖北大学站交流活动如期举行。在湖北大学计算机与信息工程学院&#xff0c;deepin(深度)社区研发工程师王溢学为热情似火的学子们开展…

手写图片懒加载

参考来自前辈 Aidan路修远i 的文章面试官&#xff1a;请你手写一下&#xff01;懒加载 - 掘金 (juejin.cn) Hello.vue <template><div><!-- src里面为空&#xff0c;data-original里面写图片真正的url(此处省略) --><img src"" data-origina…

【LeetCode滑动窗口算法】长度最小的子数组 难度:中等

我们先看一下题目描述&#xff1a; 解法一&#xff1a;暴力枚举 时间复杂度&#xff1a;o(n^3) class Solution { public:int minSubArrayLen(int target, vector<int>& nums){int i 0, j 0;vector<int> v;for (;i < nums.size();i){int sum nums[i];fo…

HarmonyOS(34) @Track使用指南

Track Track概述使用案例使用条件 Track概述 Track是class对象的属性装饰器。当一个class对象是状态变量时&#xff08;也就是使用State修饰时&#xff09;&#xff0c;Track装饰的属性发生变化&#xff0c;只会触发该属性关联的UI更新&#xff1b;而未被标记的属性不能在UI中…

Elasticsearch-IndexTemplate和DynamicTemplate 有什么区别

Elasticsearch中的Index Template和Dynamic Template是两种不同的概念&#xff0c;它们在索引管理中扮演不同的角色&#xff1a; ### Index Template&#xff08;索引模板&#xff09; 1. **目的**&#xff1a;用于定义新索引的默认设置&#xff0c;包括映射、设置、别名等。 …