PHP strtotime函数与时区问题?

我在使用PHP strtotime函数是,遇到了+9时区的问题。

$first_day = strtotime($year.'-'.$i.'-01 00:00:00');
return json($first_day);

得到的结果是 2024-01-01 09:00:00
请问到底该怎么解决才能使 strtotime 直接得到0点的时间戳?

我检查了系统的时区,timedatectl 返回的结果

               Local time: Wed 2024-01-03 22:15:09 CST
           Universal time: Wed 2024-01-03 14:15:09 UTC
                 RTC time: Wed 2024-01-03 14:15:09
                Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

PHP date_default_timezone_get() 返回的是PRC。

即便使用 DateTime 得到的依然是2024-01-01 09:00:00。

new DateTime($year.'-'.$i.'-01', new DateTimeZone('Asia/Shanghai'));
阅读 939
avatarAI BotBETA

要解决 PHP strtotime 函数与时区相关的问题,你需要正确设置 PHP 的时区,并将其应用于 strtotime 函数。在你的情况下,系统时区设置正确,但 PHP 的时区设置似乎存在问题。

首先,确保你在 PHP 代码中设置了正确的时区。你可以使用 date_default_timezone_set 函数来设置时区。在你的代码中添加以下行:

date_default_timezone_set('Asia/Shanghai');

这将设置 PHP 的默认时区为上海时区(CST)。

接下来,使用 strtotime 函数时,将日期时间字符串传递给 strtotime 函数,并指定正确的时区。在你的代码中,将日期时间字符串中的时间部分设置为 00:00:00,以确保获取的是当天的凌晨时间戳。然后,使用 DateTime 对象将时间戳转换为日期时间字符串,并指定正确的时区。

以下是修改后的代码示例:

date_default_timezone_set('Asia/Shanghai');

$year = 2024;
$i = 1;
$date = $year.'-'.$i.'-01 00:00:00';
$timestamp = strtotime($date);

$datetime = new DateTime(null, new DateTimeZone('Asia/Shanghai'));
$datetime->setTimestamp($timestamp);
$result = $datetime->format('Y-m-d H:i:s');

echo json($result); // 输出 2024-01-01 00:00:00

这样,你就可以使用 strtotime 函数直接获取指定日期当天的凌晨时间戳,并将其转换为正确的日期时间字符串。

1 个回答

strtotime 函数使用默认时区,如果你的date_default_timezone_get获取到是PRC,正常是没问题的。

可以试下这代码:

ini_set('date.timezone', 'PRC');
echo date_default_timezone_get(), PHP_EOL;
echo strtotime('today'), PHP_EOL;
echo date('Y-m-d H:i:s', strtotime('today'));

效果见:https://3v4l.org/ICbJv

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏