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 23at 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格式。

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

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

相关文章

眼科动态图像处理系统使用说明(2023-8-11 ccc)

眼科动态图像处理系统使用说明 2023-8-11 ccc 动态眼科图像捕捉存贮分析与传输系统&#xff0c;是由计算机软件工程师和医学专家组结合&#xff0c;为满足医院临床工作的需要&#xff0c;在2000年开发的专门用于各类眼科图像自动化分析、处理和传输的软件系统。该系统可以和各…

【算法】新的开始(Kruskal算法,虚拟源点)

题目 发展采矿业当然首先得有矿井&#xff0c;小 FF 花了上次探险获得的千分之一的财富请人在岛上挖了 n 口矿井&#xff0c;但他似乎忘记了考虑矿井供电问题。 为了保证电力的供应&#xff0c;小 FF 想到了两种办法&#xff1a; 在矿井 i 上建立一个发电站&#xff0c;费用…

北斗卫星为油气管道安全保障提供可靠技术支持

北斗卫星为油气管道安全保障提供可靠技术支持 随着现代社会对能源需求的不断增长&#xff0c;油气管道成为了能源输送的重要通道。然而&#xff0c;油气管道的安全风险也日益凸显。为了及时掌握油气管道的运行状态并有效地监测其安全状况&#xff0c;北斗卫星技术为油气管道监测…

vscode launch.json

有时新的服务器进行调试时&#xff0c;需要设置调试的launch.json的结果 然后就可以打开一个launch.json 其内容如下 {// 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。// 欲了解更多信息&#xff0c;请访问: https://go.microsoft.com/fwlink/?linkid83…

HTTP服务器——tomcat的安装和使用

文章目录 前言下载tomcattomcat 文件bin 文件夹conf 文件lib 文件log 文件temp 文件webapps 文件work 目录 如何使用 tomcat 前言 前面我们已经学习了应用层协议 HTTP 协议和 HTTP 的改进版——HTTPS&#xff0c;这些协议是我们在写与服务器相关的代码的时候息息相关的&#x…

C# Spire.Pdf将PDF文件转换为Word文件

一.开发框架&#xff1a; .NetCore6.0 工具&#xff1a;Visual Studio 2022 二.思路&#xff1a; 1.界面上传PDF文件&#xff0c;并保存 2.PDF文件转换为Word文件并保存 3.使用SHA256Hash判断文件是否已经转换过了&#xff0c;转换过了的话&#xff0c;就返回原先转换过的文…

Python高级语法----Python C扩展与性能优化

文章目录 1. 编写Python C扩展模块示例代码编译和运行运行结果2. 利用Cython优化性能示例代码编译和运行运行结果3. Python性能分析工具示例代码分析结果1. 编写Python C扩展模块 Python C扩展模块允许你将C语言代码集成到Python程序中,以提高性能。这对于计算密集型任务特别…

Vue3 + Three.js + gltf-pipeline大型园区场景渲染与3D业务

在非使用unity作为3D渲染方案的前提下&#xff0c;对与目前web开发者比较友好的除了canvas场景需要的2D babylon.js&#xff0c;fabric.js, Three.js是目前针对于jsWeb用户最直接且比较友好的3D引擎方案了。 准备工作&#xff1a; 1.明确需要用的场景方案都有那些&#xff0c;模…

基于ssm+vue协同过滤算法的电影推荐系统

基于ssmvue协同过滤算法的电影推荐系统 摘要 电影推荐系统在信息技术发展的背景下日益成为研究的焦点&#xff0c;本研究基于SSM&#xff08;Spring SpringMVC MyBatis&#xff09;框架与Vue.js技术&#xff0c;以协同过滤算法为核心&#xff0c;旨在构建一种高效、准确的电影…

rabbitMq创建交换机,以及路由键绑定队列教程

创建交换机&#xff1a; 创建队列&#xff1a; 创建路由&#xff0c;绑定到交换机&#xff1a; 补充&#xff1a; 创建新用户后&#xff0c;记得点进用户中&#xff0c;那两个set都点击一下&#xff1b; 还有配置代码连接的时候&#xff0c;连的端口为5672&#xff0c;可不…

C语言之文件操作(剩余部分)

上篇博客字数到极限了&#xff0c;给大家把内容补充在这一篇&#xff0c;我们还剩下文件读取结束的判定和文件缓冲区的内容没有介绍&#xff0c;让我们开始下面的学习吧&#xff01; 目录 1.文件读取结束的判定 1.1feof函数 1.2ferror函数 代码示例 2.文件缓冲区 2.1fflu…