mysql数据库时间

记录MySQL今天又一个新的问题:

场景:nodejs后台+容器部署

问题原因:纯属好心办坏事,由于考虑了时区(现在看来纯属多余),在写入时间时使用了time_str.toLocaleString("chinese", { timeZone: timeZone })方法进行转换,并将该结果写入数据库。之所以出现问题,是因为在本地测试中完全没有问题,但当部署后,写入时间就报了错误。

当时使用的格式化方法是:

// 获取中国时区的时间戳
function getUTC8TimeStamp(time?: string) {
    let time_str = time ? new Date(time) : new Date() // 时间
    const timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone // 获取时区
    let temp = time_str.toLocaleString("chinese", { timeZone: timeZone }) // 时区转换
    return temp.replace(/\//g,"-"); // /替换为-
}

报错如下:

Error: update `ac_table_id` set `expire_at` = '11/9/2023, 10:38:12 AM', `rotate` = 1 where `client_id` = 'xxx' - Incorrect datetime value: '11/9/2023, 10:38:12 AM' for column 'expire_at' at row 23
    at Packet.asError (/app/node_modules/mysql2/lib/packets/packet.js:728:17)
    at Query.execute (/app/node_modules/mysql2/lib/commands/command.js:29:26)
    at Connection.handlePacket (/app/node_modules/mysql2/lib/connection.js:478:34)
    at PacketParser.onPacket (/app/node_modules/mysql2/lib/connection.js:97:12)
    at PacketParser.executeStart (/app/node_modules/mysql2/lib/packet_parser.js:75:16)
    at Socket.<anonymous> (/app/node_modules/mysql2/lib/connection.js:104:25)
    at Socket.emit (node:events:512:28)
    at Socket.emit (node:domain:489:12)
    at addChunk (node:internal/streams/readable:324:12)
    at readableAddChunk (node:internal/streams/readable:297:9) {
  code: 'ER_TRUNCATED_WRONG_VALUE',
  errno: 1292,
  sqlState: '22007',
  sqlMessage: "Incorrect datetime value: '11/9/2023, 10:38:12 AM' for column 'expire_at' at row 23",
  sql: "update `ac_table_id` set `expire_at` = '11/9/2023, 10:38:12 AM', `rotate` = 1 where `test_id` = 'xxx'"

很显然,通过上述方法转换后的时间,在服务器上变成了11/9/2023, 10:38:12 AM格式,这里报错就是expire_at格式不正确导致的。

题外话:使用上述方式格式化的时间,在本地调试过程中打印出来全部始终都是2023-11-9 10:38:12,不清楚为什么部署到服务器以后就会变得不一样。

经过一番调试,最后结论是:要么直接返回time_str,或者使用moment格式,返回moment(time_str).format('YYYY-MM-DD HH:mm:ss'),都可以在数据库中成功写入。

比较

在解决问题的过程中,我们主要对数据库中展示的时间、从数据库获取到的时间和使用上述两种方式转换后的时间进行比较,最后得出的结论。

1. 数据库中显示的时间:

在这里插入图片描述

2.通过sql从数据库中查出来的:

在这里插入图片描述
可见,对于MySQL数据库,我们所看到的展示给我们的时间格式是YYYY-MM-DD HH:mm:ss,是数据库根据当地时区进行了转换了展示给我们看的时间,而真实存储的是UTC时间。

3.使用time_str.toLocaleString("chinese", { timeZone: timeZone })方法转换后的时间

其实问题点就出在这个地方,通过这个方法转换后的时间,在本地环境中是YYYY-MM-DD HH:mm:ss这种格式,而在服务端就变成了11/9/2023, 10:38:12 AM这种格式。

4.moment(time_str).format('YYYY-MM-DD HH:mm:ss')转换后

很显然,它是YYYY-MM-DD HH:mm:ss这种格式。

向数据库中写入数据

  1. 写入YYYY-MM-DD HH:mm:ss格式。成功
  2. 写入11/9/2023, 10:38:12 AM报错,错误如上
  3. 写入new Date()格式。成功
  4. 写入2023-11-13T08:28:43.000Z格式。报错,错误如上

综上,对于数据库timestamp格式的字段,来自前端通过各种方式格式化后的时间,服务端可以通过两种方式成功写入:

  1. new Date(time)
  2. 使用moment(time_str).format('YYYY-MM-DD HH:mm:ss')转换

new Date()比较

同样的方法new Date(),在服务端和浏览器的不同表现:

在这里插入图片描述
所以,如果遇到时间格式的问题,应该在浏览器和服务端各自分别测试。

结论:

  1. 向服务器提交时间,一律使用new Date()格式。
  2. 数据库会根据数据库当时所在的地区的时区,自动对时间做转换,只是展示出来的是经过格式化后的时间。所以,向数据库中写入时间,不需要进行格式转换,写入new Date()即可。
  3. 数据库存储时间,可以使用timestamp类型,并且写入时间不需要做转换。
  4. 由于数据库存储的时间是timestamp类型,所以,无论我们看到的是什么格式,通过sql从数据库中获取到的时间,都是2023-11-13T08:28:43.000Z这种格式,前端使用的时候需要进行时区转换,如使用moment()的方法等。
  5. 像需要通过Intl.DateTimeFormat().resolvedOptions().timeZone这种方式获取时区的场景,只适用于需要在两个时区之间进行转换的场景,如东八区到东七区。并且,通过time_str.toLocaleString("chinese", { timeZone: timeZone })这种方式获取到字符串后,写入数据库还需要使用new Date()方法进行转换成timestamp格式。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

绩效管理系统有哪些?

绩效管理系统有哪些&#xff1f; 把绩效管理系统按照两大指标分类—— 按地域划分&#xff08;主要看兼容性和稳定性&#xff09;按照功能性质划分&#xff08;主要看实用性和拓展性&#xff09; 按照以上两个维度&#xff0c;我们可以简单把绩效管理系统分为4大不同类型——…

arcgis--浮点型栅格数据转整型

利用【Spatial Analyst工具】-【数学】-【转为整型】工具&#xff0c;将浮点型数据转为整型。如下&#xff1a; 【转为整型】对话框参数设计如下&#xff1a; 转换结果如下&#xff1a;

基于ssm的学生档案管理系统(有报告)。Javaee项目,ssm项目。

演示视频&#xff1a; 基于ssm的学生档案管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm项目。 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 项目介绍&#xff…

UBC SDK日志级别重复率优化实践

作者 | wunan 导读 日志中中台每日传输的日志PV量级可达千亿级&#xff0c;在上报过程中减少冗余日志数据&#xff0c;能够降低下游数据处理的难度和成本&#xff0c;提高数据的准确性和质量&#xff0c;更好地支持业务系统的运行和优化。本文介绍了UBC SDK对日志重复打包的优化…

锅鸡unity和unityHub泼姐

链接在下面 支持pj所有国际版本的Unity和UnityHub。 自从 Unity2022.2.0 及以上版本重构了License逻辑&#xff0c;目前无法pj。问题跳转&#xff1a;#78 下载地址 Unity国际版 官方下载地址&#xff08;需要配置代理&#xff0c;代理没配置好可能会下载的国内版&#xff09…

记忆科技携手中国电信,一站式存储打造坚实数字底座

11月10日&#xff0c;以“数字科技 焕新启航”为主题的2023数字科技生态大会在广州盛大开幕&#xff0c;本次大会由中国电信、广东省人民政府联合举办&#xff0c;是一场数字科技领域的年度盛会。忆联母公司记忆科技作为中国电信的合作伙伴之一受邀参会&#xff0c;深度参与了大…

ARPG----C++学习记录05 Section10 碰撞,重叠事件

collision碰撞 Query only 仅查询。包括请求&#xff0c;扫描和重叠&#xff0c;扫描两个物体知否存在重叠Physics Only 仅物理。重力&#xff0c;反弹等物理计算都开启 按下“~”输入show collision可以查看碰撞 给石块添加碰撞&#xff0c;Query可以阻挡人物过去&#xff0c;…

域名怎么注册?一步步教你如何注册自己的域名

在互联网时代&#xff0c;网站是个人或企业展示品牌形象和推广品牌的重要工具&#xff0c;而无论是个人还是企业&#xff0c;在建设网站时&#xff0c;都需要提前注册域名。那么域名应该怎么注册呢&#xff1f;从域名选择&#xff0c;到选择域名注册商&#xff0c;再到域名注册…

段的概念_重定位的引入

段的概念 代码段、只读数据段、可读可写数据段、BSS段。 char g_Char A; //可读可写&#xff0c;不能放在ROM上&#xff0c;应该放在RAM里 const char g_Char2 B; //只读变量&#xff0c;可以放在ROM上 int g_A 0; //初始值为0&#xff0c;没有必要浪费空间 int g_B; //没…

MATLAB Simulink和SMART PLC水箱液位高度PID控制(联合仿真)

SMART PLC 向导PID的详细介绍请查看下面文章链接: S7-200 SMART PLC PID向导详细介绍(如何实现P、PD、PID控制器)-CSDN博客文章浏览阅读1k次。这篇博客主要介绍SMART PLC PID向导的使用,PID控制相关的其它内容请查看专栏系列文章,常用链接如下:SMART PLC PID负压控制(过程…

【uniapp】确认弹出框,选择确定和取消

代码如下&#xff1a; <view style"display: flex; justify-content: space-around;"><button class"button" click"submit">t提交</button> </view>submit(){let thatthisuni.showModal({title: 提示&#xff1a;,con…

AERMOD模型配置方法

数值模式模拟是分析大气污染物时空分布和成分贡献的重要工具&#xff0c;利用模拟结果可以分析大气污染的来源、成因、污染程度、持续时间、主要成分、相对贡献等问题&#xff0c;有助于分析并合理控制污染源排放&#xff0c;为产业调整提供参考。当前&#xff0c;针对不同理论…

【Linux】软硬链接和动静态库

软硬链接 软硬链接的区别&#xff1a; **软链接&#xff1a;**是一个独立文件&#xff0c;有自己独立的 inode 和 inode 编号。**硬链接&#xff1a;**不是一个独立的文件&#xff0c;它和目标文件使用的是同一个 inode。硬链接就是单纯的在 Linux 指定的目录下&#xff0c;给…

怎样能实现不同服务器之间的文件实时同步?

数字化时代&#xff0c;数据已经成为企业的重要资产&#xff0c;其中文件共享是企业运行中的重要业务场景。由于办公文件可能存在不同服务器甚至不同的城市之间&#xff0c;企业文件的实时同步是很多中大型企业急需解决的问题&#xff0c;为了不耽误业务的运行&#xff0c;甚至…

【Amazon】云上探索实验室—了解 AI 编程助手 Amazon Codewhisperer

文章目录 一、前言&#x1f4e2;二、关于云上探索实验室&#x1f579;️三、领学员需要做什么&#xff1f;✴️四、领学员能获得什么&#xff1f;&#x1f523;五、学课通道入口&#x1f447;1️⃣CSDN平台2️⃣网易云课堂3️⃣Skill Builder 平台 六、活动详情链接 一、前言&a…

【java学习—十三】处理流之六:对象流(5)

文章目录 1. ObjectInputStream 和 OjbectOutputSteam2. 对象的序列化 假设有一个Person对象 把这个对象存到电脑的硬盘上&#xff0c;硬盘存储的基础是什么&#xff1f;&#xff08;二进制&#xff09;。那就需要把对象转化为一个二进制的字节流&#xff0c;把这个流保存到电脑…

windows找不到文件xxxx\bin\startup.bat ,tomcat无法启动

问题现象&#xff1a; 问题背景&#xff1a;这是一个神经病的问题&#xff0c;开始tomcat是启动的&#xff0c;结果我的网络一直连接不上&#xff0c;然后检查发现网络适配器以及网线连接都没有问题&#xff0c;于是就按照我以往一贯处理方式&#xff1a;重启电脑&#xff0c;结…

【工具使用】STM32CubeMX-定时器PWM配置

一、概述 无论是新手还是大佬&#xff0c;基于STM32单片机的开发&#xff0c;使用STM32CubeMX都是可以极大提升开发效率的&#xff0c;并且其界面化的开发&#xff0c;也大大降低了新手对STM32单片机的开发门槛。     本文主要讲述STM32芯片定时器PWM功能的配置及其相关知识…

Word2Vec浅谈

论文地址&#xff1a;Efficient Estimation of Word Representations in Vector Space word2vec是Google团队在2013年发表的一篇paper&#xff0c;当时一经问世直接将NLP领域带到了一个新的高度&#xff0c;在2018年bert被提出之前&#xff0c;word2vec一直是NLP算法工程师追捧…

MTK Camera2 的OPEN API流程认知

MTK的设计架构 再了解Camera的open api调用之前我们&#xff0c;需要了解Camera的架构&#xff0c;这样才能提高阅读代码的效率。 代码跟读&#xff1a; 在这个图中大致介绍了OpenCamera的具体调用&#xff0c;下面我们逐步分析Camera的open调用流程。 逐步分析 一、 我们抛…