Node-解决sequelize配置时区

127 阅读5分钟

Node-解决sequelize配置时区

目录

[TOC]

什么是 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小时问题

```cobol
// 创建数据库实例(数据库名, 用户名, 密码, 配置)
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 时间。