Формат даты, отметка времени которой превышает ограничение int - PullRequest
4 голосов
/ 10 июня 2011

Итак, у нас есть следующий код:

date("Y-m-d",time()+60*365*24*60*60);

Идея состоит в том, что я должен сделать прогноз, и у меня есть результат в количестве дней, которые я должен добавить к текущей дате. Прогноз на 2060 год или более поздний ... в 64-битной среде, которая работает, но на 32-битной не так много :)

какие-нибудь идеи?

10x.

LE:

Хорошо, я попробовал:

$date = new DateTime();
// for PHP 5.3
$date->add(new DateInterval('P20000D'));
// for PHP 5.2
$date->modify('+20000day');
echo $date->format('Y-m-d') . "\n";

и это работает

Ответы [ 4 ]

2 голосов
/ 10 июня 2011

это работает на моей 32-битной системе:

$date = new DateTime("2071-05-26");
echo $date->format('Y-m-d H:i:s');

// я видел это в этом вопросе

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

Смотрите это:

http://www.infernodevelopment.com/forum/Thread-Solution-2038-PHP-Date-Bug-Y2-038K-UNIX-TIMESTAMP-BUG

<?php

// Specified date/time in your computer's time zone.
$date = new DateTime('9999-04-05');
echo $date->format('Y-M-j') ."";

// Specified date/time in the specified time zone.
$date = new DateTime('2040-09-08', new DateTimeZone('America/New_York'));
echo $date->format('n / j / Y') . "";

// INPUT UNIX TIMESTAMP as float or bigint from database
// Notice the result is in the UTC time zone.
$r = mysql_query("SELECT date FROM test_table");
$obj = mysql_fetch_object($r);

$date = new DateTime('@'.$obj->date); // a bigint(8) or FLOAT
echo $date->format('Y-m-d H:i: sP') ."";

// OR a constant greater than 2038:
$date = new DateTime('@2894354000'); // 2061-09-19 
echo $date->format('Y-m-d H:i: sP') ."";
?>
0 голосов
/ 10 июня 2011
<?php
    // A dirty hack
    function bigdate_to_string($t_64bit)
    {
        $t_base = strtotime('2038-01-01 00:00:00 +0000');
        $t_32bit = $t_64bit - $t_base;
        return date("Y", $t_32bit) + 68 . date("-m-d H:i:s", $t_32bit);
    }

    $t_64bit = 130 * 365 * 86400; // November 30, 2099 UTC
    echo bigdate_to_string($t_64bit) . "\n";
?>

Вывод:

susam@swift:~$ php datehack.php
2099-11-30 05:30:00

Я вычитаю 68 лет из этого времени и добавляю его снова при печати форматированного вывода.

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

Если вы добавляете полные годы / дни / месяцы, я полагаю, что вы можете использовать простую арифметику для них по отдельности, а затем использовать checkdate() (, который, как утверждается, работает до 32767 ), чтобы проверить результат

$date = array('Y' => date('Y'), 'm' => date('n'), 'd' => date('j'));
// +60 years
$date['Y'] += 60;
if (checkdate($date['m'], $date['d'], $date['Y'])) {
   $fulldate = implode('-', $date);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...