关于laravel时区与pgsql/mysql时区交互的问题

时区处理详解

1. 服务器时区

服务器时区是整个应用的基础,它会影响框架和数据库对时间的处理。例如,当服务器位于北京(UTC+8),并设置为北京时间时,所有从服务器获取的时间都将以此为基准。

2. 框架时区(以Laravel为例)

在Laravel框架中,全局时区设置会影响Carbon::now()now()等时间函数的结果。Laravel在config/app.php文件中设置'timezone'键的值来指定应用的默认时区。

'timezone' => 'Asia/Shanghai', // 设置为上海时区,即UTC+8

3. 数据库时区

数据库(如PostgreSQL)设置

  • 数据库设置时区:你可以通过执行命令来更改当前会话的时区。

    SET TIME ZONE 'Asia/Shanghai'//设置数据库时区为上海

    3.1 timestamptz(带时区/不带时区)

  • 不带时区的值:如果插入的时间格式为2024-07-23 16:41:54(不带时区),数据库将根据字段类型(timestamptz)和数据库的时区设置进行转换。

  • 带时区的值:如果插入的时间包含时区信息,如2024-07-23 16:41:54+08,数据库将根据字段和/或数据库的时区设置进行相应转换。

3.2 插入过程

  • 当使用Carbon::now()获取当前时间并插入数据库时,如果字段类型为timestamptz,则时间值将包含时区信息(如果Carbon对象有时区信息)。

3.3 存储过程

  • 插入带时区的值(如2024-07-23 16:41:54+08:00)时,数据库可能会根据字段和数据库的时区设置进行转换。

结论

1. 服务器的时区似乎不影响框架时区,核心是服务器的时间高于所有,然后服务器的时间是根据服务器时区算出来的
2. 带时区的格式:给正确的带时区的Y-m-d H:i:sP格式,会正确地存入数据库指定的时区。
3. 普通格式:给普通的Y-m-d H:i:s格式,将原文存入数据库,不进行时区转换。
4. Model类casts属性:只影响查询给前端的格式,不影响存入数据库的过程。

  • 设置casts属性的格式为:2024-07-23 08:38:29+00
  • 不设置casts属性的格式为:2024-07-23T08:39:07.000000Z
    5. 具体举例
  • 存入时间为北京8:00 insert sql为INSERT INTO public.tests (time, date) VALUES ('2024-01-01 08:00:00+08', '2024-01-01');结果:2024-01-01 00:00:00+0
    • 存入时间为北京8:00 insert sql为INSERT INTO public.tests (time, date) VALUES ('2024-01-01 08:00:00', '2024-01-01');结果:2024-01-01 00:00:00+0
      6. 解决方案
  • 在存入时间时使用Carbon::now()->toRfc3339String()Carbon::now()->format('Y-m-d H:i:sP')以确保包含时区信息。
  • 虽然这种方法可以确保时区信息的准确性,但可能会增加处理成本。
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!