strtotime和日期返回错误的日期

时间:2015-03-31 21:11:28

标签: php date strtotime

我不确定我在这里做错了什么但是当我从日期字符串转换为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

3 个答案:

答案 0 :(得分:2)

这实际上是正确的。 -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;
}

答案 1 :(得分:0)

您需要设置默认时区。

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

date_default_timezone_set(string $ 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语言环境)会自动适应您服务器的本地时间

答案 2 :(得分:0)

我使用较新的\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";