【问题标题】:How to parse a datetime string as current default timezone using Carbon?如何使用 Carbon 将日期时间字符串解析为当前默认时区?
【发布时间】:2019-08-19 07:50:51
【问题描述】:

我有一个不在我当前时区的日期时间字符串:2019-08-18T10:01:02Z

我需要这个字符串的 Carbon 版本。

当我这样做时:(new Carbon("2019-08-19 00:37:46"))->format('Y-m-d H:i:s');

吐出来:2019-08-18 10:01:02

我需要它来获取值2019-08-18 06:01:02(代表最终用户应用程序设置的时区)。

有没有办法在调用 Carbon 时不指定时区来做到这一点?例如不做Carbon::parse($file->getClientModified())->tz('America/New_York')

例如,我知道strtotime 考虑了时区,因此:Carbon::createFromTimestamp(strtotime($str)) 可以工作,但我觉得必须有一些我不知道的内部函数可以做到这一点。

基本上,我试图避免调用date_default_timezone_get() 或在各处获取一些配置变量。

时区通常通过date_default_timezone_set()设置。

【问题讨论】:

  • 第一个日期时间字符串时区是什么?它总是来自同一个时区还是在不同情况下发生变化?
  • 总是一样

标签: php laravel php-carbon


【解决方案1】:

您可以pass a second parameter to the constructor,指定时区。

例如:

$carbon = new Carbon('2019-08-19 00:37:46', 'America/Los_Angeles');

如果您想在应用程序方面进行更改,只需在应用程序引导期间进行。在您的应用程序service provider 中,您可以在boot() method 中进行基本的引导。

例如:

public function boot() {
     date_default_timezone_set('America/Los_Angeles');
}

【讨论】:

  • 我知道那个方法,以及上面代码中显示的tz 方法。 “有没有办法在调用 Carbon 时不指定时区来做到这一点?”例如寻找类似(不是实际功能)Carbon::createUsingCurrentTimezone($str) 的东西。所有这些时区方法都要求我实际拥有时区,我不想到处打电话给date_default_timezone_get()
  • 你可以在你的应用服务提供者boot方法中调用一次date_default_timezone_set()
  • 不是 laravel 自动做的吗?
  • 我不确定是否如此。由于您已经在使用该配置,并且我假设您已经清除了缓存;似乎没有。
  • 无论如何我都试过了,但并没有什么不同。如果我回显得到America/New_York 的时区,则在进行更改之前/之后。需要明确的是,这个日期时间字符串来自我认为使用 UTC 的 api。我不认为碳在不做Carbon::now() 之类的事情时不会考虑当前时区,这可能是为什么只明确告诉它时区有效。我想我将不得不继续使用与碳相关的 strtotime
【解决方案2】:

更新 config 文件夹中的 app.php 并在那里更新时区

'timezone' => 'America/New_York'

希望这能解决问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-07
    相关资源
    最近更新 更多