创建2014年5月13日下午3点的时间戳


Creating timestamp for 5/13/2014 @ 3pm

我有一个应用程序,需要发送一个UTC时间戳才能正常工作。在我的应用程序中,用户可以拥有任意数量的时区。因此,如果他们选择下午3点,他们的时区是美国/纽约,这是一个不同的下午3点,如果是美国/芝加哥。

我需要找出一种方法将日期更改为正确的UTC时间戳。我知道我可以使用date_default_timezone_set("UTC")…但我不认为会正常工作。

我想我需要计算UTC和常规时区之间的差异,但我不确定。欢迎提出任何建议。

date_default_timezone_set("UTC");
echo strtotime('5/13/2014 3:00 PM');

1399993200

date_default_timezone_set("America/New_York");
echo strtotime('5/13/2014 3:00 PM');

1400007600

可以看出这两个值是不同的。

编辑:这是我的代码看起来像。它似乎不能正常工作,因为应用程序没有在正确的时间显示事件。
$previous_timezone = date_default_timezone_get();
date_default_timezone_set("UTC");
$aceroute_schedule = $this->sale_lib->get_send_to_aceroute_schedule();
if (($start_time = strtotime($aceroute_schedule['aceroute_schedule_date']. ' '.$aceroute_schedule['aceroute_schedule_time_start'])) !== FALSE)
{
    //Append 000 as as string for 32 bit systems
    $start_epoch = $start_time.'000';
    $end_epoch = strtotime('+ '.$aceroute_schedule['aceroute_duration'].' minutes', $start_time).'000';
}
else //Default to current time + 1 hour
{
        //Append 000 as as string for 32 bit systems
        $start_epoch = time().'000';
        $end_epoch = strtotime('+1 hour', time()).'000';
}
$event->start_epoch = $start_epoch;
$event->end_epoch = $end_epoch;

更新:

这将在用户的DateTimeZone ('America/New_York')中创建一个DateTime对象。然后它会设置那个对象的时区为UTC。要获取时间戳(或日期的其他字符串表示形式),使用::format() .

# Create NY date
$NY = new DateTimeZone("America/New_York");
$NYdate = new DateTime('5/13/2014 3:00 PM', $NY);
# Set timezone to UTC
$UTC = new DateTimeZone("UTC");
$UTCdate = $NYdate->setTimezone($UTC);
# Get timestamp (PHP 5.2 compatible)
$timezone = $UTCdate->format('U');
var_dump($timezone); // a string containing UNIX timestamp

首先,我基于各自的DateTimeZone对象创建了2个DateTime对象。然后,我们可以使用OOP ::diff()来获取包含时间差信息的另一个对象。或者我们可以使用简单的整数表示与::getTimestamp的秒差。

$date = '5/13/2014 3:00 PM';
# Create NY date
$NY = new DateTimeZone("America/New_York");
$NYdate = new DateTime($date, $NY);
# Create UTC date
$UTC = new DateTimeZone("UTC");
$UTCdate = new DateTime($date, $UTC);
# Find difference object
$diff = $NYdate->diff($UTCdate);
var_dump($diff); // a DateInterval object containing time difference info
# Find difference in seconds
$diff = $NYdate->getTimestamp() - $UTCdate->getTimestamp();
var_dump($diff); // an integer containing time difference in seconds

链接:

  • DateTimeZone
  • DateTime
  • DateInterval

示例:http://www.php.net/manual/en/datetime.settimezone.php

$date = new DateTime('2000-01-01', new DateTimeZone('Pacific/Nauru'));
echo $date->format('Y-m-d H:i:sP') . "'n";
$date->setTimezone(new DateTimeZone('Pacific/Chatham'));
echo $date->format('Y-m-d H:i:sP') . "'n";

第一行创建一个DateTIme对象,使用时区Pacific/Nauru

然后可以使用setTimezone更改时区,如第4行所示,输出将相应地修改。

注意:默认的时区(如果你没有在第一行的第二个参数中指定它)是在你的php.ini文件中设置的,你可以用date_default_timezone_set("America/New_York")修改(在运行时)

note2:第1行第一个参数,相当于strtotime函数的第一个参数

note3: format方法采用与date相同的格式参数(http://www.php.net/manual/en/function.date.php)