我有一个应用程序,需要发送一个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)