Laravel:如何处理不同时区的日期

时间:2018-01-26 00:02:31

标签: laravel timezone

有很多关于这个问题的问题。我发现的最佳答案就是这一个:How to set local timezone in laravel 因此,主要规则是将所有数据库条目保留在同一时区。

但我有一个具体案例,这个答案对我不起作用。对于某些型号,我只有一个日期(没有日期戳)。示例:假设我只存储询问此问题的日期(= 2018-01-25)。但是在欧洲已经是2018-01-26了。有人有解决方案吗?

将我的日期字段更改为日期戳?现有日期是什么?

2 个答案:

答案 0 :(得分:1)

如果您谈论某个日期,则没有时间组件,因此时区无关紧要。因此,大多数平台没有单独的日期区域类型。

您是正确的,并非每个时区始终经历相同的日期,并且日期的开始和日期的结束发生在不同时区的不同时间。但是,您是否注意到在前一句中我必须使用“时代”这个词来理解这些要点? : - )

因为没有时间,日期和时区不会聚在一起,所以将它们保存在同一个字段中没有任何意义。相反,在模型中保留两个字段 - 一个用于日期,另一个用于时区。在许多情况下,您甚至可能会发现它们属于两种不同的模型。

作为用例示例,请考虑生日。我的是1976-08-27。这就是全部 - 只是约会。我出生的时区是无关紧要的,我所在的时区也是如此 - 直到我想评估它是否是我的生日(或者直到我的生日等等)那些操作,我当前的时区很重要,那个时区的开始时间和结束时间也是如此。因此 - 两个不同的领域。

答案 1 :(得分:1)

您可以使用此库jamesmills/laravel-timezone

OR

如果您需要自定义配置:

  1. 将应用时区配置为UTC。

    '时区'=>'UTC',

  2. 您可以在数据库列中存储不同的时区。

  3. 在输出/显示日期时,只需将其格式化为使用该时区即可。

    $ timezone ='美国/温哥华';
    $ model-> created_at-> setTimezone($ timezone);

created_at updated_at 会自动转换为Carbon实例,这使此操作变得更加容易。如果您还有其他日期要使用,请将其添加到protected $dates array on the model中,laravel也会将其转换为carbon实例。然后,您可以使用carbons setTimezone()将日期/时间更改为时区。