strtotime 和 date 返回不正确的日期

strtotime and date returning incorrect date

我不确定我在这里做错了什么,但是当我从日期字符串转换为 strtotime 并返回格式更好的日期字符串时,日期是错误的:

2015-03-20T20:00:00-0600 | Saturday Mar 21, 2015 02 00:am

左边是输入变量 & 右边是以下代码的输出:

  <?php
    $eventDate = '2015-03-20T20:00:00-0600';
    $originalTime = $eventDate;
    $eventDate = date('l M j, Y h i:a', strtotime($eventDate));
  ?>
  Date: <?php echo $originalTime;?> | <?php echo $eventDate; ?>

正确的输出应该是Friday March 20th, 2015 8:00pm

您需要设置默认时区。

http://php.net/manual/en/function.date-default-timezone-set.php

date_default_timezone_set(字符串 $timezone_identifier)

我不确定你的服务器配置的时区,但试试这个:

<?php
    date_default_timezone_set('UTC');
    $eventDate = '2015-03-20T20:00:00+0000';
    $originalTime = $eventDate;
    $eventDate = date('l M j, Y h i:a', strtotime($eventDate));
  ?>
  Date: <?php echo $originalTime;?> | <?php echo $eventDate; ?>

作为旁注,我将时区偏移量从 -0600 更改为 +0000

也就是说,在您设置默认时区或更正 $eventDate 中的时区偏移之前,您尝试设置的日期(使用 -0600 语言环境)会自动适应您服务器的本地时间.

我会使用较新的 \DateTime API。还要适当地设置默认时区。在大多数情况下,您可以省略下面的时区参数。我保留它是为了在必要时展示它是如何完成的。

$timezone = new DateTimeZone("America/New_York");
$eventDate = new DateTime('2015-03-20T20:00:00-0600', $timezone);
echo $eventDate->format('l M j, Y h i:a') . "\n";

其实是对的。 -0600 部分表示您的输入字符串比系统时间早 6 小时,因此 PHP 增加 6 小时,从而得到 Mar 21, 2015 02 00:am.

要获得正确的日期和时间,请使用 date_default_timezone_set() 函数。对我来说是:

date_default_timezone_set("Europe/Amsterdam");

这会将时间从 UTC 转换为您的本地时间。如果这对您不起作用,您可以随时使用 strstr():

$eventDate = strstr($eventDate, '+', true);
if ($eventDate === false) {
    $eventDate = $originalTime;
}