我有以下代码:
// $this->date_from = '11/01/2017';
// $this->date_to = '11/30/2017';
$this->where_date_from = Carbon::parse($this->date_from)->tz('America/Toronto')->startOfDay()->timestamp;
$this->where_date_to = Carbon::parse($this->date_to)->tz('America/Toronto')->endOfDay()->timestamp;
这会产生完全无效的时间戳。它似乎实际上减去了UTC的偏移量的两倍。
但是,当我使用以下内容时:
date_default_timezone_set('America/Toronto');
$this->where_date_from = strtotime($this->date_from.' 00:00:00');
$this->where_date_to = strtotime($this->date_to.' 23:59:59');
效果很好。
为什么会这样?我想使用Carbon来实现这一点,所以我不必使用date_default_timezone_set
。
答案 0 :(得分:0)
此处的问题是tz
正在运行。事实上,如果给定时区,它将不会使您的日期被解析,但它会将日期从当前时区转换为您给出的时区。假设您在timezone
文件中UTC
设置了app.php
(默认值是什么),您现在正在做的事情:
$this->where_date_from = Carbon::parse($this->date_from, 'UTC')->tz('America/Toronto')->startOfDay()->timestamp;
因此,您假设日期是UTC时区,然后您将其转换为America / Toronto,这显然不是您想要的。
你应该做的是在解析日期时传递时区,如下所示:
$this->where_date_from = Carbon::parse($this->date_from, 'America/Toronto')->startOfDay()->timestamp;
$this->where_date_to = Carbon::parse($this->date_to, 'America/Toronto')->endOfDay()->timestamp;