Использование is_dst в mktime () в PHP 5.3 (параметр устарел) - PullRequest
1 голос
/ 01 июня 2011

Начиная с 5.3 параметр is_dst устарел в mktime. Но мне нужны две предыдущие метки времени, одна с dst, а другая без.

Например: в первый раз mktime("03","15","00","08","08","2008",1) и другие mktime("03","15","00","08","08","2008",0)

Можете ли вы помочь мне решить эту проблему?

Ответы [ 2 ]

1 голос
/ 01 июня 2011

Я нашел этот интересный ответ в Google:

/*
    Since you're getting that error I'll assume you're using PHP 5.1 or
    higher. UTC has no concept of DST, so what you really want to be using
    are strtotime() and date_default_timezone_set(). Here's the idea:
*/

$someString = '10/16/2006 5:37 pm'; //this is a string
date_default_timezone_set('American/New_York'); //this is the user's timezone. It will determine how the string is turned into UTC

$timestamp = strtotime($someString); //$timestamp now has UTC equivalent of 10/16/2006 5:37 pm in New York
echo date('Y/m/d H:i:s', $timestamp); //prints out the nicely formatted version of that timestamp, as if you were in New York

date_default_timezone_set('American/Los_Angeles');
echo date('Y/m/d H:i:s', $timestamp); //prints out the nicely formatted version of that timestamp, as if you were in LA -- takes care of the conversion and everything

/*
    So, setting the timezone then using strtotime() and date() takes care
    of all the DST/non-DST stuff, converting between timezones, etc.
*/

Просмотр источника .

0 голосов
/ 01 июня 2011

Не полный ответ, только некоторые идеи, которые я мог бы придумать ... Метод DateTime :: format () принимает код формата, который сообщает, действует ли DST:

$now = new DateTime;
$is_dst = $now->format('I')==1;

Теперь, чтобы узнать, во сколько это было бы, если бы DST был наоборот, вы должны выяснить, когда такое изменение произойдет.Этот код:

$time_zone = $now->getTimeZone();
var_dump( $time_zone->getTransitions(strtotime('2011-01-01'), strtotime('2011-12-31')) );

... печатает:

array(3) {
  [0]=>
  array(5) {
    ["ts"]=>
    int(1293836400)
    ["time"]=>
    string(24) "2010-12-31T23:00:00+0000"
    ["offset"]=>
    int(3600)
    ["isdst"]=>
    bool(false)
    ["abbr"]=>
    string(3) "CET"
  }
  [1]=>
  array(5) {
    ["ts"]=>
    int(1301187600)
    ["time"]=>
    string(24) "2011-03-27T01:00:00+0000"
    ["offset"]=>
    int(7200)
    ["isdst"]=>
    bool(true)
    ["abbr"]=>
    string(4) "CEST"
  }
  [2]=>
  array(5) {
    ["ts"]=>
    int(1319936400)
    ["time"]=>
    string(24) "2011-10-30T01:00:00+0000"
    ["offset"]=>
    int(3600)
    ["isdst"]=>
    bool(false)
    ["abbr"]=>
    string(3) "CET"
  }
}

Если вы получаете переходы для года, к которому относится дата, вы можете собрать список смещений в соответствии с isdst TRUE иisdst ЛОЖЬ.Как только вы выберете подходящее смещение, все остальное легко:

$winter_offset = 3600;
$summer_offset = 7200;
$difference = $winter_offset-$summer_offset;
$winter = $now->modify( ($difference<0 ? '' : '+') . $difference . ' seconds');
echo $winter->format('H:i:s');
...