目录
什么是 UTC(协调世界时)?
UTC 的重要性
UTC 和本地时间的关系
如何转换 UTC 和本地时间?
为什么要使用 UTC?
如何在编程中使用 UTC?
Day.js 示例:
使用 Sequelize 进行数据库操作时:
官方文档
总结
什么是 UTC(协调世界时)?
UTC(Universal Time Coordinated,协调世界时)是全球标准的时间系统,用于确保世界各地的时间能够一致。UTC 不受任何国家或地区时区的影响,它是所有时区的基准时间。它是基于地球自转的平均值和原子时钟的精确度来定义的。
UTC 的重要性
-
全球统一时间:不同的国家和地区有不同的时区,时间可能相差很大。如果没有统一的时间标准,全球的交流、交易和合作就会变得非常困难。UTC 提供了一个全球一致的标准,所有地方的时间都可以根据它来进行转换。
-
科技应用:在计算机科学、网络通信、航天、金融市场等领域,精确的时间非常重要。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 而不是本地时间有以下几个好处:
-
避免时区混乱:在跨时区的活动中(比如全球会议、航班安排、股票交易等),UTC 提供了一个清晰的参考,避免了不同地区时区差异导致的混乱。
-
节省资源和精力:如果所有的时间都使用 UTC,那么你不需要担心夏令时、冬令时或时区变动的问题。
-
统一记录时间:在数据库、日志文件和网络通信中,使用 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, // 将时间格式转换为字符串},
});
timezone
和 dialectOptions
在 Sequelize 中的作用
timezone
:
timezone
选项用于指定连接 MySQL 数据库时所使用的时区。- 当你连接到数据库时,Sequelize 会根据你提供的时区来调整从数据库返回的时间。
- 在你的例子中,
timezone: "+08:00"
表示 Sequelize 会使用 UTC+8 时区(常见于中国等地区)。 - 这样可以确保从数据库返回的日期和时间值在正确的时区下显示。
dialectOptions
:
dialectOptions
允许你设置与所使用的数据库方言相关的额外选项。在你的例子中,使用的是 MySQL 数据库(dialect: "mysql"
),因此这个选项帮助配置与 MySQL 相关的特定行为。
你在代码中配置的选项 dateStrings: true
和 typeCast: true
是用来处理 MySQL 中日期和时间字段的返回方式:
dateStrings: true
:这个选项告诉 Sequelize 将日期和时间字段以字符串的形式返回,而不是返回 JavaScript 的Date
对象。这在需要处理日期时间为特定格式字符串时非常有用。typeCast: true
:此选项确保 Sequelize 能够正确地转换和解释日期时间字段,通常用于处理 MySQL 中的DATETIME
或TIMESTAMP
字段。
官方文档
你可以在 Sequelize 的官方文档中找到关于这些选项的详细说明:
- Timezone 选项:Sequelize Timezone
- DialectOptions 选项:Sequelize Dialect Options
总结
- UTC 是全球标准时间,用于避免时区差异带来的混乱。
- 本地时间 是基于时区调整后的时间,通常比 UTC 快或慢。
- 在全球化的应用、数据库和开发中,使用 UTC 可以确保时间的一致性。
- 在编程中,许多库和框架(如 Sequelize)都支持通过配置时区选项来处理 UTC 时间。