【问题标题】:Changing Timezone of Carbon Object更改碳对象的时区
【发布时间】:2019-01-25 18:46:10
【问题描述】:

我正在使用 Carbon 解析的字符串并指定 UTC 时区。然后,我将时区切换到 America/Denver 并输出格式化的字符串,时间值不会改变。我究竟做错了什么?我已经搜索过所有内容,我所阅读的所有内容都表明这应该可行。

$date = Carbon::parse('2018-08-19 10:43:15', 'UTC');
Log::info($date->timezone->getName());
Log::info($date->format('n/j/y g:i A'));

$date->setTimezone('America/Denver');

Log::info($date->timezone->getName());
Log::info($date->format('n/j/y g:i A'));

我的日志返回:

[2018-08-19 11:23:17] local.INFO: UTC  
[2018-08-19 11:23:17] local.INFO: 8/19/18 10:43 AM  
[2018-08-19 11:23:17] local.INFO: America/Denver  
[2018-08-19 11:23:17] local.INFO: 8/19/18 10:43 AM  

【问题讨论】:

  • 你的代码改变了我的时间,我在欧洲/伦敦。这是返回真还是假:var_dump(date_default_timezone_set('UTC'));
  • 它返回为真。我将服务器的默认时区和 PHP 设置为 UTC,这样当我将值插入我的 mysql 数据库时,它们将被存储为 UTC。我要做的是获取从我的数据库返回的 UTC 值,然后将其转换为本地时区。
  • 您上面的代码显示我的 6 小时差异,我所做的唯一更改是转储值而不是记录。除了你 var_dump 它们只是为了消除它,我想我想不出别的了。
  • 我也试过$date->setTimezone('America/Denver')->format('n/j/y g:i A');,它也返回相同的值。

标签: php timezone php-carbon


【解决方案1】:

没有代码错误。这是一个 CentOS 7 服务器。当我更改时区时,我将 UTC 文件复制到 /etc/localtime,覆盖了 /usr/shared/zoneinfo 中当前符号链接的 America/Denver 文件。正确的过程是删除 /etc/localtime 的符号链接并重新创建它以指向正确的时区文件。因为我的 America/Denver 文件已被 UTC 文件覆盖,所以服务器将 America/Denver 时间返回为 UTC。

我的解决方案是从另一台服务器复制 America/Denver 文件并覆盖我损坏的 America/Denver 文件。这解决了我的问题。

【讨论】:

    猜你喜欢
    • 2014-11-14
    • 1970-01-01
    • 1970-01-01
    • 2014-11-14
    • 1970-01-01
    • 2014-09-22
    • 2015-01-29
    • 1970-01-01
    相关资源
    最近更新 更多