2013-08-27 2 views
0

У меня проблема со временем сравнения с PHP - я думаю, что я должен делать что-то глупое, но я пробовал разные вещи в течение нескольких часов, и я просто ударяю о кирпичную стену.Сравнение времени PHP Nightmare

Я вынимаю данные из API EVE, а затем делаю чек, там, где есть подписка, и где есть навык в обучении - с обоими из них есть определенный временной интервал (1 неделя для подписки и 12 часов для навыков), что я хотел бы отметить предупреждение, но я не могу заставить его работать вообще. Результат всех дат и времени, кажется, правильный формат, который я просто не могу получить, чтобы сравнение работало.

Мне интересно, может ли кто-нибудь указать, что наиболее вероятно, моя глупая ошибка и дать мне толчок в правильном направлении.

спасибо взглянуть,

<?php 
// ---- For Skill Queue 
$apiSection = "char/SkillQueue"; 
$urlChar = "https://api.eveonline.com/$apiSection.xml.aspx?keyID=$keyID&vCode=$vCode&characterID=$charID"; 
$data = file_get_contents($urlChar); 
$xml = new SimpleXMLElement($data); 
foreach ($xml->result->rowset->row as $row){ 
     $charQueueEndTemp = $row{'endTime'}; 
} 
$charQueueEnd = date("d-m-Y H:m", strtotime($charQueueEndTemp)); 
//echo "Skill Test" . $charQueueEnd; 

// --- Account API 
$apiSection = "account/AccountStatus"; 
$urlAccount = "https://api.eveonline.com/$apiSection.xml.aspx?keyID=$keyID&vCode=$vCode"; 
$data = file_get_contents($urlAccount); 
$xml = new SimpleXMLElement($data); 
$accSubsTemp = $xml->result->{'paidUntil'}->{0}; 
$accSubs = date("d-m-Y H:m", strtotime($accSubsTemp)); 


date_default_timezone_set('Europe/Paris'); 
$currentDate = date("d-m-Y H:m"); 
$lessWeek = date("d-m-Y H:m", strtotime("-1 week")); 
$plusWeek = date("d-m-Y H:m", strtotime("+1 week")); 
$plus12Hour = date("d-m-Y H:m", strtotime("+12 hour")); 
//Date Tests 
//echo "</br> Curent Date: ".$currentDate; 
//echo "</br> Plus Week: ".$plusWeek; 
//echo "</br>Acc Subs: ".$accSubs; 
//echo "</br>Acc +12: ".$plus12Hour; 

// -- Account Subscribed Check 
if($currentDate > $accSubs){ 
     echo "Account is not Subscribed"; 
} 
elseif($plusWeek > $accSubs){ 
     echo "Account has less than 1 week Subscription"; 
} 
else{ 
     echo "Account is Subscribed"; 
} 

// -- Skill Training Check 
if($charQueueEnd = null){ 
     echo "Skill Queue Ended"; 
} 
elseif($plus12Hour > $charQueueEnd){ 
     echo "Skill Queue ending in less than 12 Hours"; 
} 
else{ 
     echo "Skill Queue Active"; 
} 
?> 
+2

НЕ СРАВНИТЬ ДАТУ/ВРЕМЯ КАК СТРОИТЕЛЬНЫЕ ЗНАЧЕНИЯ –

+0

Преобразовать в «timestamp» (UNIX будет довольно безопасным, так как EVE только раунд в течение 10 лет или около того) и сравнить их. – naththedeveloper

ответ

3

Начните использовать DateTime класс для даты/времени манипуляции/сравнения:

Если вы измените свой код на этот:

$currentDate = new DateTime(); 
$lessWeek = new DateTime("-1 week"); 
$plusWeek = new DateTime("+1 week"); 
$plus12Hour = new DateTime("+12 hour"); 

... тогда ваш IF заявления начнет работать.

1

Если вы хотите сравнить даты вы должны сравнить функции аргументы, возвращаемые StrToTime(), например:

elseif(strtotime($plus12Hour) > strtotime($charQueueEnd)){ 
2

Вы делаете дату сравнение полностью WRONG. Вы сравниваете дату STRINGS, например. используя некоторые даты, отформатированные так же, как и вы:

$plusWeek = '26-08-2013 8:30'; Aug 26th, 2013 
$accSubs = '9-08-2013 10:45'; Aug 9th, 2013 

Поскольку это строки, применяются правила сравнения строк. Это означает, что строки сравниваются по характеру, а (string)26 на самом деле Меньше, чем string(9), потому что 2 меньше, чем 9.

Вам нужно сохранить что-то в качестве необработанных временных меток, например. strtotime() выход:

$plusWeek = strtotime('2013-08-26 08:30'); // 1377527400 
$accSubs = strtotime('2013-08-09 10:45').; // 1376066700 

Сравнивая эти целые значения будут работать, как вы хотите.

Основная проблема заключается в том, что вы не отформатировали свои строки данных в порядке «наиболее значимых данных». Если они были отформатированы с первым годом, например.

yyyy-mm-dd hh:mm:ss 

тогда сравнение строк БЫЛО работать как побочный эффект.

+0

Большое вам спасибо за подробный ответ. Теперь я чувствую себя очень глупо. Я знал, что это будет совершенно неправильно. Теперь я вижу, почему пытаюсь сопоставить форматы перед изменением моего вывода - спасибо за ваше время! – Jamie

+0

всегда сохраняют такие вещи, как даты/время, в собственных внутренних форматах. Вы только конвертируете в строки во время отображения. –