Eri*_*own 25 php datetime laravel laravel-5
我正在尝试找到一种解决方法,如何将存储在我的数据库中的日期时间转换为“yyyy-mm-dd HH-mm-ss”,并为其指定时区“America/Los_Angeles”。
如果我更改时区,Carbon 将自动从时间中减去 7 小时,这是将时间从 UTC 更改为 PST 时发生的情况,但我的数据库中的时间设置为 PST 时间。例如,我希望今天的时间是上午 10 点,但是我更改了时区,Carbon 会将其转换为今天上午 3 点。
如何将时区更改为 PST 但仍将时间保持在上午 10 点?我需要 API 调用的时区,这就是我需要弄清楚的原因。
小智 24
使用shiftTimezone()方法而不是setTimezone()。
如果您调用setTimezone()Carbon 的现有实例,它会将日期/时间更改为新的时区,例如:
$datetime = Carbon::createFromFormat('Y-m-d H:i:s', '2020-09-15 23:45:00');
echo $datetime->toAtomString() . "\n";
// 2020-09-15T23:45:00+00:00
$datetime->setTimezone('America/Los_Angeles');
echo $datetime . "\n";
// 2020-09-15T16:45:00-07:00
Run Code Online (Sandbox Code Playgroud)
但是,调用shiftTimezone()将设置时区而不更改时间。让我们从头开始再试一次:
$datetime = Carbon::createFromFormat('Y-m-d H:i:s', '2020-09-15 23:45:00');
echo $datetime->toAtomString() . "\n";
// 2020-09-15T23:45:00+00:00
$datetime->shiftTimezone('America/Los_Angeles');
echo $datetime->toAtomString() . "\n";
// 2020-09-15T23:45:00-07:00
Run Code Online (Sandbox Code Playgroud)
当然,您也可以将这些方法链接在一起:
$datetime = Carbon::createFromFormat('Y-m-d H:i:s', '2020-09-15 23:45:00')
->shiftTimezone('America/Los_Angeles');
echo $datetime->toAtomString() . "\n";
// 2020-09-15T23:45:00-07:00
Run Code Online (Sandbox Code Playgroud)
您还可以通过将时区作为settings数组的一部分传递来“移动”时区
:
$datetime = Carbon::createFromFormat('Y-m-d H:i:s', '2020-09-15 23:45:00')
->settings(['timezone' => 'America/Los_Angeles']);
echo $datetime->toAtomString() . "\n";
// 2020-09-15T23:45:00-07:00
Run Code Online (Sandbox Code Playgroud)
Afi*_*eri 16
我认为你要找的是这个:
Carbon::createFromFormat('Y-m-d H:i:s', $some_date, 'UTC')
->setTimezone('America/Los_Angeles')
Run Code Online (Sandbox Code Playgroud)
首先,您设置最初拥有的时区,因此,如果您在数据库中将日期存储为 UTC,则将默认时区设置为 UTC,然后使用->setTimeZone('Valid/Timezone')将您拥有的时区更改为新时区。
更好更简单的方法是:
$carbon = new Carbon('YYYY-MM-DD HH:II:SS', 'America/Los_Angeles');
Run Code Online (Sandbox Code Playgroud)
注意:不要忘记添加依赖项use \Carbon\Carbon;。
我对这个问题的回答会有点不同。对于我的情况,我有一个需要解析的日期字符串,就好像它是自定义时区中给定日期的第 0 个小时(午夜)一样- 但我数据库中的所有日期都是以 UTC 跟踪的,所以我真正需要的是要做的是将日期保留在 UTC 时区,但给它一个预期时区的“反向偏移”。
情况:我得到一个日期字符串“2020-09-02”,我将用它来查看 X 条记录是否具有同一日期或之后的字段;但是,我位于美国/芝加哥时区,当前距离 UTC 为 -05:00,因此我需要将此日期字符串的 UTC 版本调整为 2020-09-02 05:00,以准确说明我所在时区的午夜。
为此,我需要将日期字符串解析为美国/芝加哥时区,然后将时区更改为 UTC:
$value = "2020-09-02"
Carbon::parse($value . ' America/Chicago')->tz('UTC')
Run Code Online (Sandbox Code Playgroud)
好吧,我想出了一种愚蠢但实用的方式来做我想做的事情,并且它有效。
这是我的代码:
$dt = Carbon::parse($request->ShootDateTime)->timezone('America/Los_Angeles');
$toDay = $dt->format('d');
$toMonth = $dt->format('m');
$toYear = $dt->format('Y');
$dateUTC = Carbon::createFromDate($toYear, $toMonth, $toDay, 'UTC');
$datePST = Carbon::createFromDate($toYear, $toMonth, $toDay, 'America/Los_Angeles');
$difference = $dateUTC->diffInHours($datePST);
$date = $dt->addHours($difference);
Run Code Online (Sandbox Code Playgroud)
我有时间想转换为时区并解析它并更改时区。然后我获取日、月和年并创建 2 个不同的日期,两者在时间上都将读取为 00:00:00,但由于在这种情况下它们相隔 7 小时,因此它们只能是 00:00: 00 如果它们有 7 个小时的不同,这就是我接下来要捕获的内容。最后,我取初始日期时间并将差异添加到它,在适当的时区给我适当的时间。
这很丑陋,但它有效。
| 归档时间: |
|
| 查看次数: |
46335 次 |
| 最近记录: |