Mysql timestamp 类型时区问题

news/2024/11/20 17:01:00/文章来源:https://www.cnblogs.com/sjwbot/p/18558754

1. 问题描述

当使用 timestamp 类型存储时间字段时,经常发生时区错误,比如相差 8 小时这样的问题。

2. 为什么会发生

首先要介绍一个 timestamp 的存储结构与工作模式。

2.1. timestamp 的存储结构

当在 DB 表结构中使用 timestamp 字段时,DB 内部是以一个时间戳保存数据的,不存储具体时区。而展示 timestamp 字段时,是以年月日时分秒形式展示的。时间戳本身是不包含时区信息的,那么这要如何转换呢?

2.2. timestamp 如何展示

答案是根据 session 的时区来转换。而 session 的时区有两种设置方式,一种是在建立连接时由 client 设定,一种是使用 DB server 的全局默认时区。

2.3. timestamp 如何传输

是按照年月日时分秒形式传输的。比如:

  • 当查询一个 timestamp 字段时,server 取到 字段的时间戳,再用 session 的时区,转换为 年月日时分秒 的字符串,然后把这个字符串返回给 client。
  • 当update 或者 insert 一个 timestamp 字段时,client 传输给 server 的也是一个 年月日时分秒 的字符串,server 根据 session 的时区,转化为时间戳,再保存到字段中。

2.4. 转换发生的时机

查询过程:

server 取时间戳 -> server 使用 session 时区 转换为 字符串 -> client 接收字符串 -> client 可能会使用 client 系统时区转换成时间戳

写入过程:

client 获取时间戳 -> client 使用 client 系统时区换成字符串 -> server 使用 session 时区转换为时间戳

2.5. 问题原因

client 使用的时区与session时区不同。

2.6. 解决方案(python sqlalchemy)

client 本地时区与 session 时区保持一致。

import pytz
from datetime import datetime
from flask_sqlalchemy import SQLAlchemy
TZ = 'Asia/Shanghai'
TIME_ZONE = pytz.timezone(TZ)# 指定本地时区
now = datetime.now(TIME_ZONE) # 时区是 +08:00
dt_from_timestamp = datetime.fromtimestamp(1714289876, TIME_ZONE) # 时区是 +08:00, TIME_ZONE 参数不可省略,否则 datetime 对象缺失 时区属性# 指定 session 时区
db = SQLAlchemy(engine_options={"connect_args"   : {"init_command": f'SET time_zone="{TZ}"'}},
)# 查询 DB 时 datetime 默认时区是空,需要手动补充时区后取用
user = db.session.query(User).first()
# create_timestamp = user.created.timestamp() # 错误,user.created 对象 时区属性为空,转换为 timestamp 时会使用系统默认时区,可能与 session 时区不一致
# create_timestamp = user.created.replace(tzinfo=TIME_ZONE).timestamp() # 错误,时区是 +08:06,最终时间戳相差了 360 秒
create_timestamp = TIME_ZONE.localize(user.created).timestamp() # 正确,时区是 +08:00

用这种方式,既不依赖 client 系统默认时区,也不依赖 DB 默认时区。保证了 client 使用的时区与 session 一致,都是 TZ 变量的取值。TZ 也可以从环境变量来取值。

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

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

相关文章

由于目前头像不足

一个人收两个头像咋样

CH592工具更新说明

①首先拔除电脑上的所有串口工具,再插入我们需要烧录程序的串口,确保能找到我们要下载固件的COM口,一般同一个串口工具在同一台电脑上所分配的COM号是唯一的 ②打开工具,点击Search Device,会跳出对应的COM号③搜索到COM号后可以拔掉串口,开始硬件接线,VCC接串口3V3,GN…

批量解除 此文件来自其他计算机,可能被阻止以帮助保护该计算机

下载微软工具 - Streams https://learn.microsoft.com/en-us/sysinternals/downloads/ streams -s -d D:/file留待后查,同时方便他人 联系我:renhanlinbsl@163.com

使用linq查询报错English Message : Join a needs to be the same as OrderBy it

可以使用 .Select 和 .MergeTable() 将多表结果集变成单表:这样问题就可以解决了

【淘汰9成NLP工程师的常识题】LSTM的前向计算如何进行加速?

【淘汰9成NLP工程师的常识题】LSTM的前向计算如何进行加速? 重要性:★★★ 💯 这是我常用的【淘汰9成NLP工程师的常识题】LSTM的前向计算如何进行加速? 重要性:★★★ 💯这是我常用的一个面试题。看似简单的基础题,但在面试中能准确回答的不足10% ,常识题的错误反而会…

【论文阅读笔记】多模态大语言模型必读 —— LLaVA

LLaVA (Large Language and Vision Assistant),proposed by Haotian Liu (UWM), et al.论文地址:https://arxiv.org/abs/2304.08485 代码地址:https://github.com/haotian-liu/LLaVA目录简介Visual Instruction 数据生成视觉指令微调模型架构训练 简介 人类对于世界的认知是…

接口文档和编写接口测试用例

一、熟悉接口文档和分析接口 1、发送接口文档 2、分析接口文档 3、了解需要测试接口,分析需求文档接口请求参数:接口返回参数:成功整理接口:(自己项目有哪些借款) cms项目接口:查询接口,登录接口,添加用户接口,用户管理接口,文章管理接口,删除用户接口,删除栏目接…

python代码实现RNN, LSTM, GRU

安装torch, transformers, loguru(本代码实现为下方版本,其余版本实现可比葫芦画瓢自行摸索)pip install torch==1.13.1 transformers==4.44.1 numpy==1.26.4 loguru -i https://pypi.tuna.tsinghua.edu.cn/simple/RNN:Recurrent Neural Network,网络结构如下图所示:import nu…

ChatGPT国内中文版镜像网站整理合集(2024/11/20)

ChatGPT 镜像站的用途 镜像站(Mirror Site)ChatGPT镜像网站是指通过复制原始网站内容和结构,创建的备用网站。其主要目的是在原始网站无法访问时,提供相同或类似的服务和信息。​ 一、ChatGPT中文镜像站 ① yixiaai.com 支持4o以及o1,支持MJ绘画 ② chat.lify.vip 支持通用…

鸿蒙NEXT开发案例:随机数生成

【引言】 本项目是一个简单的随机数生成器应用,用户可以通过设置随机数的范围和个数,并选择是否允许生成重复的随机数,来生成所需的随机数列表。生成的结果可以通过点击“复制”按钮复制到剪贴板。 【环境准备】 • 操作系统:Windows 10• 开发工具:DevEco Studio NEXT Be…

13、优化器_(执行计划、统计信息)_1

执行计划 一个SQL文本,经过解析,经过解析之后,oracle发现有很多种执行方案,然后oracle在这多种执行方案中,选出一种oracle认为最优的一种执行方案,来作为执行计划,然后oracle按照执行计划一步步去执行 因为oracle有多种的执行方案,但是,有的执行方案快,有的执行方案慢…