PHP DateTime中函数的值?

时间:2013-08-30 09:07:37

标签: php

好吧,我最终会因此而斗智斗勇。我已经试图解决这个问题3天了,而且我无处可去。

我需要在两个位置之间获取$offset的值,并将其设置为(00:00)的设定时间。

这是我如何设置$offset值,它的工作正常。

<?php

if( isset($_POST['submit']))
{
    //be sure to validate and clean your variables
    $timezone1 = htmlentities($_POST['timezone1']);
    $timezone2 = htmlentities($_POST['timezone2']);

    //then you can use them in a PHP function. 
    function get_timezone_offset( $origin_tz, $remote_tz ) {
        $timezone1 = new DateTimeZone ( $origin_tz );
        $timezone2 = new DateTimeZone ( $remote_tz );

        $datetime1 = new DateTime ("now", $timezone1);
        $datetime2 = new DateTime ("now", $timezone2);

        $offset = $timezone1->getOffset($datetime1) - $timezone2->getOffset($datetime2);
        return $offset;

    }

$offset = get_timezone_offset($timezone1, $timezone2);

}

?>

以下是我尝试使用DateTime做我想做的事情,这段代码只会回显$offset值,而不会将其从00:00取消

<?php
if (0 > $offset)
{
// set an object with the current date
$date = new DateTime();
$date->setTime(00, 00);

// the second date
$date2 = new DateTime($offset/3600 * 1);

// apply the diff() method, getting a DateInterval object ($diDiff)
$diDiff = $date->diff($date2) ;
}
echo $diDiff->format("%H:%i");
?> 

我甚至尝试使用strtotime但是strtotime返回了错误的值,并且我被stackoverflow上的一些人建议使用DateTime。

<?php
$time1 = strtotime('00:00');

if (0 > $offset)
{
   // For negative offset (hours behind)
  $hour_dif = date('H:i', strtotime($time1 -$offset/3600));
  $time1 = "{$hour_dif}";
}
elseif (0 < $offset)
{
   // For positive offset (hours ahead)
     $hour_dif = date('H:i', strtotime($time1 +$offset/3600));
     $time1 = "{$hour_dif}";

}
else
{
   // For offsets in the same timezone.
   $time1 = "in the same timezone";
}

echo "{$time1}";
?>

请有人帮助我,因为这绝对是在节省我的时间。

3 个答案:

答案 0 :(得分:0)

以下代码将打印按$offset小时数调整的输入时间。

$date = new DateTime();
$date->setTime(00, 00);

$date->add(DateInterval::createFromDateString("{$offset} hours"));

echo $date->format('H:i');

我再次测试了这个解决方案(使用PHP 5.4.17)并正确地改变了时间。

PHPFiddle:http://phpfiddle.org/main/code/rhd-pj4

答案 1 :(得分:0)

你也可以使用Carbon轻松解决这个问题,这个类会大大简化任何类型的日期计算:

// example timezones
$timezone1 = 'Europe/Berlin'; 
$timezone2 = 'Asia/Yakutsk'; 

$dt1 = Carbon::createFromDate(2000, 1, 1, $timezone1);
$dt2 = Carbon::createFromDate(2000, 1, 1, $timezone2);

// false will force a relative difference, so it can be a negative result
$difference = $dt1->diffInMinutes($dt2, false);

$dtMidnight = Carbon::create(2000, 1, 1, 12, 0, 0);

// get the difference from midnight
$differenceFromMidnight = $dtMidnight->addMinutes($difference);

echo $differenceFromMidnight->hour;
echo $differenceFromMidnight->minute;

答案 2 :(得分:0)

这可以处理正偏移和负偏移:

$sign = $offset >= 0 ? 1 : -1;
$offset = $offset * $sign;  // make sure offset is a positive number

// set an object with the current date
$date = new DateTime();
$date->setTime(00, 00);

// the second date
$date2 = new DateTime();
$interval = new DateInterval("PT" . $offset . "S");
if ($sign > 0) {
    $date2->add($interval);
} else {
    $date2->sub($interval);
}

echo $date2->format("H:i");