Проблема форматирования с PHP DateTime Разница при использовании в качестве части уравнения - PullRequest
3 голосов
/ 02 сентября 2011

Я пытаюсь написать простую систему выставления счетов.Я хотел использовать DateTime Diff для расчета стоимости каждого счета.

Пока у меня есть:

/* In this example $dayLength and $ratePerSec don't really matter but we will use the 
   hypotethical values of 8.0 and 0.0054 for now */

$date1 = new DateTime( "Time1FromDatabase", [DateTimeZoneOfChoice] );
$date2 = new DateTime( "Time2FromDatabase", [DateTimeZoneOfChoice] );

$diff = $date2->diff( $date1 );
$lenInSec = $diff->format("%y")*365*$dayLength*3600 + 
            $diff->format("%d")*$dayLength*3600 + 
            $diff->format("%h")*3600 + 
            $diff->format("%i")*60 + 
            $diff->format("%s");

$cost = $lenInSec * $ratePerSecond;

Когда я пытаюсь вывести стоимость, используя $ lenInSec, сгенерированный из DateTime Diff, я получаюдействительно странные результаты.Иногда, где-то 1 к 3 и 1 к 50 разам, я получаю правильное значение, скажем, 460.25.В большинстве случаев я просто получаю случайную строку букв, цифр или символов, например: þ50.

Я обнаружил, что если я получу результат 2+ раза, то при окончательном выводе получуожидаемый результат совершенно.

Мое временное исправление в данный момент заключается в том, чтобы в функции getCost () выполнить:

ob_start();
echo $cost;
echo $cost;
ob_clean();
return $cost;

И до сих пор это, похоже, решает проблему, и мне кажется,чтобы получить ожидаемый результат каждый раз, но это немного странно.

Я знаю, что это Diff DateTime в уравнении, потому что, если я заменю его на старый стиль:

strtotime( "Time2FromDatabase") - strtotime( "Time1FromDatabase")

это работаетидеально каждый раз.

У меня также есть текущие итоговые затраты:

$totalCost += $cost;

Вывод $ totalCost всегда выводит правильное значение независимо от того, использую ли я метод DateTime Diff или метод strtotime.

Я также пытался использовать intval.(int) и (string) преобразуют переменную $ lenInSec перед ее использованием в уравнении, и она не имеет никакого эффекта.

Может кто-нибудь дать какие-либо подсказки относительно того, почему это происходит?Это (n) (не) известная ошибка в PHP-классах DateTime / Diff?

EDIT:

$date1 = new DateTime( "2011-09-04 09:00:00", new DateTimeZone("UTC") );
$date2 = new DateTime( "2011-09-04 18:00:00", new DateTimeZone("UTC") );

//Essentially 1 day of work

$rate = 200.00; //Per Day
$ratePerSec = 0.00617283950617283950617283950617; 
// $rate / (9 hours * 3600 seconds )

$lenInSec = 32400; // From the diff calculation

$cost = $lenInSec * $ratePerSec; // Cost should now equal 200. 

echo $cost; // Sometimes outputs 8, other times 200, other times þ50.

//I think the þ50 is when you have a number like 425.50 where þ is the 425.

$totalCost += $cost;

echo number_format($totalCost,2); /* Will return the correct 
value of all the $cost variables added no matter what the individual $cost 
variables are output as, in this case 200.00 */

1 Ответ

0 голосов
/ 10 сентября 2011

Насколько я могу судить, это не ошибка в классе DateTime. Скорее всего, это происходит из другого места в вашем коде.

Исходя из предоставленных вами фрагментов кода и ваших комментариев, я создал следующее:

$totalCost = 0; // uninitialized in your sample code, potential source of problem
$dayLength = 9;
$rate = 425.50;

$ratePerSecond = $rate / ($dayLength * 3600);

// 2 days, 3 hours
$date1 = new DateTime( "2011-09-10 09:00:00", new DateTimeZone("UTC") );
$date2 = new DateTime( "2011-11-10 12:00:00", new DateTimeZone("UTC") );

$diff = $date2->diff( $date1 );
$lenInSec = $diff->format("%y")*365*$dayLength*3600 + 
            $diff->format("%d")*$dayLength*3600 + 
            $diff->format("%h")*3600 + 
            $diff->format("%i")*60 + 
            $diff->format("%s");

$cost = $lenInSec * $ratePerSecond;

$totalCost += $cost;

echo number_format($totalCost,2);

который всегда дает 141.83.

Вы действительно не предоставляете достаточно кода или конкретный пример, приводящий к проблеме форматирования. Ничто в указанном вами коде никогда не должно приводить к случайной строке букв, цифр или символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...