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.mzph.cn/news/143404.shtml

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

相关文章

MOS管体电极接源端版图layout画法

记录一个lvs一直跑不通的问题。 问题描述&#xff1a;lvs一直显示某几个MOS管的体电极连接问题。连线没有问题&#xff0c;版图中已经画了衬底。 原因&#xff1a; 图中四个管子的衬底接了源端&#xff0c;没接电源。 解决办法&#xff1a; 法1、源端接地 法2、将这四个管子…

一个项目进行测试的一些最基本环境

在一个项目开发到发布的整个过程中&#xff0c;会使用到很多个环境进行测试和运行项目。最基本的开发环境、测试环境、准生产环境、生成环境 一、开发环境 开发环境顾名思义就是我们程序猿自己把项目放到自己的电脑上&#xff0c;配置好以后&#xff0c;跑起来项目&#xff0…

Git的基本操作以及原理介绍

文章目录 基本操作创建git仓库配置name和email .git目录的结构git add & git commit.git目录结构的变化 git追踪管理的数据git的版本回退回退的原理回退的三种情况 版本库中文件的删除git分支管理分支的删除合并分支时的冲突分支的合并模式分支策略git stash不要在master分…

【软考篇】中级软件设计师 第三部分(一)

中级软件设计师 第三部分&#xff08;一&#xff09; 十七. I/O管理软件十八. 输入/输出技术十九. 总线系统二十. 磁盘管理20.1 移臂调度算法20.2 缓冲区 二十一. 操作系统二十二. 数据库22.1 三级模式-两级映射22.2 数据库设计22.3 规范化理论22.4 范式判断22.5 模式分解 二十…

C++基础知识记录

github仓库不定期更新: https://github.com/han-0111/CppLearning 文章目录 C如何工作编译器和链接器编译器预处理(Preprocessing)includedefineif/endif 链接器一种比较复杂的情况 变量变量类型intcharshortlonglong longfloatdoublebool如何查看数据大小 函数头文件条件语句…

2023年亚太杯数学建模思路 - 案例:ID3-决策树分类算法

文章目录 0 赛题思路1 算法介绍2 FP树表示法3 构建FP树4 实现代码 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法&#xff0c;就是频繁模…

运营商大数据,金融贷款精准营销赢得客户

运营商大数据精准营销赢得客户推广 在大数据的新形势下&#xff0c;它推动了经济和金融的发展趋势。其中&#xff0c;大数据获取客户是企业营销和推广的一个阶段&#xff0c;是新一轮的转型发展。通过大数据准确获取客户是一个基本概念。 大数据根据您指定的物理模型选择客户&…

【ArcGIS Pro二次开发】(76):面积平差工具

之前做过一个【三调土地利用现状分类面积汇总】的工具&#xff0c;在流程中使用了面积平差的方法。 考虑了在其它场合可能也需要进行面积平差&#xff0c;因此单独提取出来作为一个工具。 平差实现的方法如下图&#xff1a; 主要的计算过程如上图所示&#xff0c;算出总面积差…

【luckfox】3、计算重量差

前言 本章结合之前的hx711驱动&#xff0c;实现读取质量&#xff0c;记录时间及剩余质量并存入csv文件&#xff0c;计算质量差并总计。 代码 luckfox-pico\project\app\test_app\hx711\hx711_app_addtime.c #include <stdio.h> #include <stdlib.h> #include &…

MySQL数据库约束

目录 数据库约束 1.NULL约束 2.UNIQUE&#xff1a;唯一约束 3.DEFAULT&#xff1a;默认值约束 4.PRIMARY KEY&#xff1a;主键约束 5.FOREIGN KEY&#xff1a;外键约束 数据库约束 以下为本篇文章会介绍的约束 (1)NOT NULL - 指示某列不能存储 NULL 值。 (2)UNIQUE - …

带头双向循环链表

目录 一、结构定义 二、结点创建 三、头结点初始化 四、链表打印 五、尾插 六、头插 七、尾删 八、头删 九、查找&#xff08;返回结点&#xff09; 十、任意位置插入 十一、任意位置删除 十二、利用LTInsert写尾插函数 十三、利用LTInsert写头插函数 十四、利用…

pipeline + node +jenkins+kubernetes部署yarn前端项目

1、编写Dockerfile文件 # Set the base image FROM node:16.10.0# WORKDIR /usr/src/app/ WORKDIR /home/option# Copy files COPY ./ /home/option/# Build arguments LABEL branch${BRANCH} LABEL commit${COMMIT} LABEL date${BUILD_DATE} ARG ENV# Set ENV variables ENV …

视频封装格式

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层基础上加入…

Leetcode——岛屿的最大面积

1. 题目链接&#xff1a;695. 岛屿的最大面积 2. 题目描述&#xff1a; 给你一个大小为 m x n 的二进制矩阵 grid 。 岛屿 是由一些相邻的 1 (代表土地) 构成的组合&#xff0c;这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都…

Moto edge s pro手机 WIFI和蓝牙连接不上 解决方法分享

2021年12月入手一台Moto Edge S Pro 12256版&#xff0c;看着性价比很高&#xff0c;越用越垃圾。屏幕显示没有vivo亮丽/APP图标很丑/屏幕上一点点水就失灵/拍照片边缘是模糊的/系统几乎不更新。 以上都可以忍受&#xff0c;但是&#xff1a; 用一年不到&#xff0c;蓝牙不能…

前端 vue 面试题 (一)

文章目录 v-if,v-show差别v-for和v-if虚拟dom解决什么问题vue的data为什么返回函数不返回对象比较vue&#xff0c;reactvue双向绑定原理vue虚拟dom 的diff算法vue 虚拟dom的diff算法的时间复杂度vue2与vue3的区别vue数据缓存&#xff0c;避免重复计算单页应用怎么跨页面传参vue…

Java 设计模式——中介者模式

目录 1.概述2.结构3.案例实现3.1.抽象中介类3.2.抽象同事类3.3.具体同事类3.4.具体中介类3.5.测试 4.优缺点5.使用场景 1.概述 &#xff08;1&#xff09;一般来说&#xff0c;同事类之间的关系是比较复杂的&#xff0c;多个同事类之间互相关联时&#xff0c;他们之间的关系会…

Python爬取股票交易数据代码示例及可视化展示。

文章目录 前言一、开发环境二、第三方模块三、爬虫案例步骤四、爬虫程序全部代码1.分析网页2.导入模块3.请求数据4.解析数据5.翻页6.保存数据 五、实现效果六、数据可视化全部代码1.导入数据2.读取数据3.可视化图表4.效果展示关于Python技术储备一、Python所有方向的学习路线二…

Windows本地配置带GPU的Pytorch环境

首先需要安装并配置好Anaconda环境&#xff0c;安装教程教程随便找一个就好。 第一步&#xff1a;安装好之后创建conda虚拟环境&#xff1a; conda create -n your_env_name pythonx.x 第二步&#xff1a;安装需要版本的pytorch&#xff1a;pytorch下载链接 cu100/torch-1.2…

VUE基础的一些总结

首先推荐观看VUE官方文档 目录 创建一个 Vue 应用 要创建一个 Vue 应用&#xff0c;你需要按照以下步骤操作&#xff1a; 步骤 1&#xff1a;安装 Node.js 和 npm 确保你的计算机上已经安装了 Node.js。你可以在 Node.js 官网 上下载并安装它。安装完成后&#xff0c;npm&…