Background

我的应用程序使用UTC作为数据库的时区,这是应该的.

目前我的所有用户都是本地用户,但我将在许多不同的时区拥有用户.

我的应用程序中的大多数东西都只是日期,所以我只是将它们存储为日期,而不go 管它.

然而,我读到了this advice in the carbon docs,我想我应该把我的日期换成时间戳,并存储适当的精确度,不管我是否需要它.

我的大多数约会对象都没有真正的时间概念,甚至在概念上也是如此,尽管我理解并在理论上同意上述联系的前提.

My Question

我将使用我自己的时区作为这个问题的示例.现在是夏令时,我们在中部夏令时,比协调世界时晚5个小时.

几周前,我们在CST,比UTC晚6个小时.

我的问题是.假设我在2个月前在数据库中存储了一个日期,该日期与世界标准时间相差6小时.现在我正在从数据库中读取日期,但现在是CDT,只有5小时的差异.Carbon知道这一点并进行相应的处理吗,或者我总是会遇到与夏令时有关的时区问题.

我担心的是,我的很多日期只是日期,它们实际上没有时间成分,所以它们最终会是2023-04-07 05:00:002023-02-01 06:00:00左右.在接近午夜的情况下,计算错误可能会完全更改日期,而错误转换的日期可能不会被注意到.

So what's the solution?

它是否将偏移量存储在日期字段中,以便始终与日期一起存储?处理这一问题的公认方法是什么,或者说最合乎逻辑的方法是什么?

如果上面的方法是正确的,那么它看起来像是Laravel有$table->timestampsTz()method,所以我需要将我所有的日期和时间戳转换成时间戳Tz列……然后我假设一定有某种方法告诉laravel在写入created_atupdated_at列时包括偏移量,或者可能它只是自动知道.

在我浪费更多的时间在这之前,试着确定这是正确的方法.

另外,看起来MySQL没有存储时区信息,所以我真的不知道如何解决这个问题.

一开始,我认为只需将日期字段更改为时间戳就相当简单,但我读得越多,事情就变得越复杂.

推荐答案

Carbon 文档的这一建议通常是正确的.但有一种约会并不是时间上的.有很多例子:你驾照上的出生日期就是其中之一.无论你go 澳大利亚还是冰岛,你的出生日期都是一样的.当然,你的出生时刻在这些地方的当地时间是不同的,实际上可能是在不同的日历日期.但这不是出生日期的工作方式.节假日的日期也是如此.

DATE数据类型(在MySQL中)用于这些类型的日期.它与时区无关.这只是个日历日期.

这可能就是你想要的.这取决于你应用程序中日期的含义.

另一方面,如果您想要存储时间上的时刻,如"视频通话在America/New_York时区的上午9点开始,America/Los_Angeles时区的早上6点开始,那么时间戳数据类型就是您想要的.

许多应用程序都有这两种日期.这就是数据库和编程环境提供这两种数据类型的原因.为了这个目的,你只需要选对一个.

Php相关问答推荐

如何在Laravel Controller中存储文本区域值?

产品ACF值在WooCommerce我的账户订单的附加列中为空

输入手写CSV时在PHP中进行日期判断

在PHP中替换数组中的文本并同时使用其他函数

Symfony装置加载:try 从命名空间加载类";ClassUtils";Doctrine\Common\Util";

PHP原始数据读取引发max_input_vars错误

允许在WooCommerce管理员优惠券列表中显示自定义优惠券类型

将一个情态形式放在细丝v3中的形式中间

根据WooCommerce中的客户计费国家/地区更改产品价格

针对给定产品类别的WooCommerce计数审核

HTAccess重写一些URL,但将所有其他URL发送到另一个页面

未检测到laravel控制器

Shopware 6 插件:如何删除布尔配置并将其迁移到多选配置

woocommerce_available_ payment_gateways 过滤器挂钩多次触发

调度程序不发送任何消息

在 WordPress 中将自定义帖子类型永久链接设置为 root

根据页面的最后修订日期设置 MediaWiki 内部链接的样式

后退按钮不起作用 laravel ajax crud

为什么 AJAX 请求没有通过 is_ajax_request() codeigniter 的条件?

通过php在xml文件中添加 node