Node-解决sequelize配置时区

embedded/2024/12/28 13:27:41/

目录

什么是 UTC(协调世界时)?

UTC 的重要性

UTC 和本地时间的关系

如何转换 UTC 和本地时间?

为什么要使用 UTC?

如何在编程中使用 UTC?

  Day.js 示例:

使用 Sequelize 进行数据库操作时:

官方文档

总结


什么是 UTC(协调世界时)?

UTC(Universal Time Coordinated,协调世界时)是全球标准的时间系统,用于确保世界各地的时间能够一致。UTC 不受任何国家或地区时区的影响,它是所有时区的基准时间。它是基于地球自转的平均值和原子时钟的精确度来定义的。

UTC 的重要性

  1. 全球统一时间:不同的国家和地区有不同的时区,时间可能相差很大。如果没有统一的时间标准,全球的交流、交易和合作就会变得非常困难。UTC 提供了一个全球一致的标准,所有地方的时间都可以根据它来进行转换。

  2. 科技应用:在计算机科学、网络通信、航天、金融市场等领域,精确的时间非常重要。UTC 为这些领域提供了一个精确且全球统一的时间标准。

UTC 和本地时间的关系

本地时间是你所在时区的时间,而 UTC 是全球标准时间。例如,中国使用的是 北京时间(CST,China Standard Time),它比 UTC 提前 8 小时,即 UTC+8

如果你在美国纽约,使用的时间是 东部标准时间(EST,Eastern Standard Time),它比 UTC 慢 5 小时,即 UTC-5。因此,纽约时间的夏令时(EDT)是 UTC-4

如何转换 UTC 和本地时间?

为了确保不同地区的时间一致,通常使用 UTC 作为基准,然后根据各自的时区进行调整。

示例:

假设现在是 2024年12月27日 10:00 AM UTC,那么:

  • 在北京(UTC+8),时间将是 2024年12月27日 6:00 PM(下午6点)。
  • 在纽约(UTC-5),时间将是 2024年12月27日 5:00 AM(早上5点)。

为什么要使用 UTC?

使用 UTC 而不是本地时间有以下几个好处:

  1. 避免时区混乱:在跨时区的活动中(比如全球会议、航班安排、股票交易等),UTC 提供了一个清晰的参考,避免了不同地区时区差异导致的混乱。

  2. 节省资源和精力:如果所有的时间都使用 UTC,那么你不需要担心夏令时、冬令时或时区变动的问题。

  3. 统一记录时间:在数据库、日志文件和网络通信中,使用 UTC 记录时间能确保数据的准确性和一致性。这样,无论在哪个时区读取数据,都能得到相同的时间。

如何在编程中使用 UTC?

在编程中,尤其是使用 JavaScript 或 Node.js 时,可以使用 dayjs 来处理 UTC 时间。

  Day.js 示例:
 

Day.js 默认是 不处理时区问题的,所以需要引入Timezone 插件,即:

const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
const timezone = require('dayjs/plugin/timezone') // dependent on utc plugin
dayjs.extend(utc)
dayjs.extend(timezone)dayjs.tz.setDefault("Asia/Shanghai") dayjs() // 依旧是服务器/本地时区
dayjs.tz() //这样才是指定的时区

但这里有一个小问题,即timezone插件只影响dayjs.tz()的行为,不影响dayjs()的行为。(见:设置默认时区 · Day.js (gitee.io))

所以引入timezone插件后要改为调用dayjs.tz()才能获取到指定时区的dayjs对象。

1
2
3
4
5
6
7
8
9
10
const dayjs = require('dayjs')
const utc = require('dayjs/plugin/utc')
const timezone = require('dayjs/plugin/timezone') // dependent on utc plugin
dayjs.extend(utc)
dayjs.extend(timezone)dayjs.tz.setDefault("Asia/Shanghai") dayjs() // 依旧是服务器/本地时区
dayjs.tz() //这样才是指定的时区
使用 Sequelize 进行数据库操作时:

在数据库操作中,我们通常希望将时间存储为 UTC  会出现一个关于创建时间写入和读取时差8小时问题

// 创建数据库实例(数据库名, 用户名, 密码, 配置)
const seq = new Sequelize(MYSQL_DB, MYSQL_USER, MYSQL_PWD, {host: MYSQL_HOST, // 数据库地址dialect: "mysql", // 数据库类型timezone: "+08:00", // 时区// 解决时间格式问题dialectOptions: {dateStrings: true, // 将时间格式转换为字符串typeCast: true, // 将时间格式转换为字符串},
});

timezonedialectOptions 在 Sequelize 中的作用

timezone

  • timezone 选项用于指定连接 MySQL 数据库时所使用的时区。
  • 当你连接到数据库时,Sequelize 会根据你提供的时区来调整从数据库返回的时间。
  • 在你的例子中,timezone: "+08:00" 表示 Sequelize 会使用 UTC+8 时区(常见于中国等地区)。
  • 这样可以确保从数据库返回的日期和时间值在正确的时区下显示。

dialectOptions

dialectOptions 允许你设置与所使用的数据库方言相关的额外选项。在你的例子中,使用的是 MySQL 数据库(dialect: "mysql"),因此这个选项帮助配置与 MySQL 相关的特定行为。

你在代码中配置的选项 dateStrings: truetypeCast: true 是用来处理 MySQL 中日期和时间字段的返回方式:

  • dateStrings: true:这个选项告诉 Sequelize 将日期和时间字段以字符串的形式返回,而不是返回 JavaScript 的 Date 对象。这在需要处理日期时间为特定格式字符串时非常有用。
  • typeCast: true:此选项确保 Sequelize 能够正确地转换和解释日期时间字段,通常用于处理 MySQL 中的 DATETIMETIMESTAMP 字段。

官方文档

你可以在 Sequelize 的官方文档中找到关于这些选项的详细说明:

  • Timezone 选项:Sequelize Timezone
  • DialectOptions 选项:Sequelize Dialect Options

总结

  • UTC 是全球标准时间,用于避免时区差异带来的混乱。
  • 本地时间 是基于时区调整后的时间,通常比 UTC 快或慢。
  • 在全球化的应用、数据库和开发中,使用 UTC 可以确保时间的一致性。
  • 在编程中,许多库和框架(如 Sequelize)都支持通过配置时区选项来处理 UTC 时间。

http://www.ppmy.cn/embedded/149450.html

相关文章

AI与药学:ChatGPT与临床培训——药学博士(Pharm-D)学生的看法、担忧和实践

一、文献信息 标题: ChatGPT and Clinical Training: Perception, Concerns, and Practice of Pharm-D Students 作者: Zawiah M, Al-Ashwal FY, Gharaibeh L, Abu Farha R, Alzoubi KH, Abu Hammour K, Qasim QA, Abrah F 期刊: Journal of Multidisciplinary Healthcare 二…

docker基础命令入门、镜像、运行容器、操作容器

一. Docker 基础入门相关命令 1.1 启动Docker 1.2 查看 Docker 运行状态 1.3 停止 Dokcer 1.4 重启Docker 1.5 配置开机启动 docker 1.6 查看 docker 所有命令 二. Docker 镜像相关命令 2.1 docker search 镜像名称——(查询某个镜像) 2.2 docker pull 镜像名称:version…

【人工智能离散数学基础】——深入详解图论:基础图结构及算法,应用于图神经网络等

深入详解图论:基础图结构及算法,应用于图神经网络等 图论(Graph Theory)是数学中研究图这种离散结构的分支,广泛应用于计算机科学、网络分析、人工智能等领域。随着图神经网络(Graph Neural Networks, GNNs…

如何在谷歌浏览器中管理下载记录

谷歌浏览器作为广受欢迎的网络浏览器之一,不仅提供了高效的网页浏览功能,还具备了强大的文件下载管理功能。本文将详细介绍如何在谷歌浏览器中查看和管理下载记录,帮助您更高效地使用浏览器。 一、访问下载管理器 1.快速访问: 点…

深入探究C++pow函数的优势和劣势 原理

优势 功能强大 支持多种数据类型&#xff1a; C 的pow()函数在<cmath>头文件中定义&#xff0c;它能够灵活地处理不同的数据类型。对于整数类型&#xff0c;如int、long long等&#xff0c;它能准确地计算幂次方。以计算棋盘上的麦粒数为例&#xff0c;传说国际象棋棋盘…

腾讯文字方向点选验证码识别

注意&#xff0c;本文只提供学习的思路&#xff0c;严禁违反法律以及破坏信息系统等行为&#xff0c;本文只提供思路 如有侵犯&#xff0c;请联系作者下架 本文识别已同步上线至OCR识别网站&#xff1a; http://yxlocr.nat300.top/ocr/textclick/8 注意&#xff1a;本文是篇水…

Python的Pandas--Series的创建和实现

1.Series函数的格式&#xff1a; pandas.Series(data,index,dtype,name,copy) data&#xff1a;一组数据&#xff08;ndarray类型、list、dict等类&#xff09;或标量值 index&#xff1a;数据索引标签。如果不指定&#xff0c;默认为整数&#xff0c;从0开始 dtype&#x…

开放世界目标检测 Grounding DINO

开放世界目标检测 Grounding DINO flyfish Grounding DINO 是一种开创性的开放集对象检测器&#xff0c;它通过结合基于Transformer的检测器DINO与基于文本描述的预训练技术&#xff0c;实现了可以根据人类输入&#xff08;如类别名称或指代表达&#xff09;检测任意对象的功…