mysql数据库时间

news2024/11/22 10:03:48

记录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格式。

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

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

相关文章

android studio开发flutter应用,使用mumu模拟器调试软件

安装好mumu模拟器&#xff0c;先打开网易mumu模拟器的开发者模拟。系统应用 > 设置 > 关于手机 > 版本号 多点击几次调出开发者模式&#xff1a; 然后在android studio中刷新设备列表&#xff0c;就能看到新设备了&#xff1a; 如何确定这个设备就是你的mumu模拟器呢…

Cesium:绘制点

作者&#xff1a;CSDN _乐多_ 本文记录了在Cesium中绘制点的函数。 文章目录 data() 里面设置点的样式 pointOption: {show: true,pixelSize: 10,heightReference: Cesium.HeightReference.CLAMP_TO_GROUND,color: Cesium.Color.RED,outlineColor: Cesium.Color.YELLOW,outl…

视频封装格式

FLV&#xff08;Flash Video&#xff09; FLV封装格式 Tag Data分为Audio&#xff0c;Video&#xff0c;Script三种 TS&#xff08;Transport Stream&#xff09;传输流 TS文件分为三层&#xff0c;&#xff08;倒叙更好理解&#xff09; TS层&#xff1a;在PES层基础上加入…

java 旋转方阵

public static void main(String[] args) {Scanner scanner new Scanner(System.in);// N阶方阵int n scanner.nextInt();// 构建方阵List<List<Integer>> matrix new ArrayList<>();for (int i 0; i < n; i) {List<Integer> row new ArrayLis…

RUST与Python对比分析

1 什么是Rust&#xff1f; Rust 是一种系统编程语言&#xff0c;注重安全性&#xff0c;尤其是并发安全性&#xff0c;支持函数式、命令式和泛型编程范式等多范式语言。Rust 在语法上与 C 类似&#xff0c;但设计者希望在保持性能的同时提供更好的内存安全性。Rust 最初是由 Mo…

集团VPN问题排查及核心交换机(思科C9500)路由编写

前言 昨天发现子公司A无法访问子公司B的服务器。已知之前是可以的。经过tracert及ping的简单排查。发现&#xff0c;A没有经过飞塔200F的防火墙出去。 已知集团使用两套防火墙。思科2110以及飞塔200F。并且在上方都做了VPN的配置。200F承接SD-WAN。 我们知道&#xff0c;当A公…

详述使用CubeMX配置STM32RCC时钟

&#x1f64c;秋名山码民的主页 &#x1f602;oi退役选手&#xff0c;Java、大数据、单片机、IoT均有所涉猎&#xff0c;热爱技术&#xff0c;技术无罪 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 获取源码&#xff0c;添加WX 目录 前言一…

帮助中心干货 | 4步即可快速搭建高效帮助中心

任何一个产品有用户涌入使用之后&#xff0c;都会不可避免地面临一个场景问题&#xff1a;如何及时、高效、便捷地解决用户使用过程中的问题&#xff1f; 在使用某些网站的功能或服务时&#xff0c;用户常常会遇到一些看似简单但没有说明依然可能难以理解的问题。如果问题没有…

linux查看端口占用情况

lsof命令 lsof(list open files)命令可以列出当前系统中打开的所有文件&#xff0c;包括网络端口。可以使用lsof命令查看某个端口被哪个进程占用。 具体的命令为&#xff1a;sudo lsof -i :端口号&#xff0c;其中端口号为需要查询的端口号。 netstat命令 使用netstat命令&a…

Vatee万腾的数字化掌舵:Vatee科技引领未来的新高度

随着数字化时代的到来&#xff0c;Vatee万腾以其卓越的科技决策力成为引领潮流的掌舵者。 Vatee万腾通过对科技前沿的不懈探索&#xff0c;站在了数字化创新的最前沿。其领先的科技团队致力于发掘并应用最新的数字技术&#xff0c;为用户提供卓越的数字化体验。 Vatee万腾以其…

运动耳机哪个牌子好性价比高?运动耳机品牌排行榜前十名

​其实&#xff0c;选择运动耳机并不只是看外观&#xff0c;性能也同样重要。在选择时&#xff0c;我们需要考虑几个关键因素&#xff0c;例如稳固性、舒适度和音质等。这些都是运动耳机必备的要求&#xff0c;因为它们能帮助我们在运动时更加专注于锻炼&#xff0c;而不会被耳…

操作系统——死锁(一文详解死锁,死锁产生的原因和死锁的解决方案)

1、什么是死锁&#xff1f;死锁产生的条件&#xff1f; 1.1、什么是死锁&#xff1f; 答&#xff1a; 在两个或者多个并发进程中&#xff0c;如果每个进程持有某种资源而又等待其它进程释放它或它们现在保持着的资源&#xff0c;在未改变这种状态之前都不能向前推进&#xff…

Python:Virtual Environment——venv

文章目录 1 基本信息2 创建虚拟环境3 venv如何工作 1 基本信息 venv支持构建轻量级虚拟环境 包含独立的位于其site文件夹中的python package venv构建在base Python上在虚拟环境中执行pip会将package安装在当前的隔离环境中一个venv包含&#xff1a; 独立的Python解释器、libr…

在线预览编辑PDF::RAD PDF for ASP.NET

RAD PDF for ASP.NET作为功​​能最齐全的基于 HTML 的 PDF 查看器、编辑器和 ASP.NET 表单填充器&#xff0c;RAD PDF 为传统 PDF 解决方案提供了灵活而强大的替代方案。与 Adob​​e Acrobat Reader 不同&#xff0c;RAD PDF 几乎可以在任何现代网络浏览器中运行&#xff0c;…

推荐5款靠谱好用,无广告不流氓的软件

​ 话不多说&#xff0c;直入正题&#xff0c;全都是靠谱好用&#xff0c;无广告不流氓的好软件&#xff0c;可以先点赞收藏&#xff0c;以后慢慢用。 1.视频压缩工具——Moo0 VideoMinimizer ​ Moo0 VideoMinimizer是一款绿色免安装的视频压缩工具&#xff0c;它可以让你轻…

深度学习+opencv+python实现昆虫识别 -图像识别 昆虫识别 计算机竞赛

文章目录 0 前言1 课题背景2 具体实现3 数据收集和处理3 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数&#xff1a;2.4 全连接层2.5 使用tensorflow中keras模块实现卷积神经网络 4 MobileNetV2网络5 损失函数softmax 交叉熵5.1 softmax函数5.2 交叉熵损失函数 6 优化器SGD7 学…

干货!工业级3D开发工具HOOPS的开发环境探讨——3D模型格式转换篇

HOOPS产品主要应用于3D模型的转换、显示、处理和发布&#xff0c;包括HOOPS Exchange、HOOPS Communicator、HOOPS Visualize和HOOPS Publish等4种产品&#xff0c;其中&#xff1a; HOOPS Exchange主要应用于模型的文件格式转换。HOOPS Communicator主要应用于WEB端模型显示。…

百济神州财报解读:第三季度扭亏为盈,胜利来晚了?

短短几年时间&#xff0c;从国产创新药一哥&#xff0c;到如今唯一一家在纳斯达克、港交所、上交所三地上市的生物科技公司&#xff0c;飞速的发展和超强的融资能力&#xff0c;早已让百济神州成为了一面反映“创新药企”发展状况的镜子。 因此&#xff0c;百济神州的业绩也牵…

Python测试开发中Django和Flask框架的区别

在谈Python中Django框架和Flask框架的区别之前&#xff0c;我们需要先探讨如下几个问题。 1、为什么要使用框架&#xff1f; 为了更好地阐述这个问题&#xff0c;我们把开发一个应用的过程进行类比&#xff0c;往往开发一个应用&#xff08;web应用、系统应用&#xff09;跟建…

c#桥接模式详解

基础介绍&#xff1a; 将抽象部分与它的实现部分分离&#xff0c;使它们都可以独立地变化。适用于不希望在抽象和实现部分之间有固定的绑定关系的情况&#xff0c;或者类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充的情况。 将抽象部分与实现部分分离&#xff0c;…