2015-07-09 3 views
5

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

  • 01.01.2016
  • 01.01.2016 00:00:00

Это я не проблема, если у меня есть старт дате за ваучер, но это проблема, если у меня была дата окончания . Я использую strtotime для преобразования пользовательского ввода в метку времени UNIX.

Если вы только что указали дату, как дата окончания, это должен быть конец используемого дня. Как это:

01.01.2016 -> 01.01.2016 23:59:59 -> 1451689199 

Но - и это моя проблема - strtotime возвращает ту же метку времени, конечно, для 01.01.2016 и 01.01.2016 00:00:00. И когда пользователь вводит время, это время должно использоваться, конечно.

01.01.2016 
1451602800 
-> should go to 1451689199 

01.01.2016 00:00:00 
1451602800 
-> is correct 

01.01.2016 23:59:59 
1451689199 
-> is correct 

мне нужна возможность проверить, если строка - это преобразуется strtotime - имеет время явное в ней. Я искал функцию для этого без успеха, даже класс DateTime не имеет метода для этого (hasTime() или что-то в этом роде).

Как я уже говорил, все формы даты и времени strtotime также должны поддерживаться этой функцией.

Этот вопрос не является дубликатом! Я хочу проверить, указано ли какое-либо время, указанное явно. Вопрос, который должен быть дубликатом, является основным вопросом для начинающих PHP и не имеет ничего общего с этой проблемой!

ответ

1

Я бы проверить длину строки перед вызовом StrToTime и добавьте 23:59:59:

$dates = array('01.01.2016','01.01.2016 23:59:59','01.01.2016 10:25:30'); 
foreach($dates as $date) { 
    echo "date=$date\n"; 
    if (strlen($date) > 10) { 
     echo strtotime($date),"\n"; 
    } else { 
     echo strtotime($date . ' 23:59:59'),"\n"; 
    } 
} 

Выход:

date=01.01.2016 
1451689199 
date=01.01.2016 23:59:59 
1451689199 
date=01.01.2016 10:25:30 
1451640330 
+0

Это идея ;-) Я проверю это:) – Richard

0

с учетом ввода '2015031' или '2015031 10:39', вы можете попробовать первый, если он возвращает false, попробуйте другой.

никаких гарантий по надежности, хотя

php > var_dump(DateTime::createFromFormat('Ymd H:s','2015031')); 
bool(false) 
php > var_dump(DateTime::createFromFormat('Ymd H:s','2015031 10:29')); 
object(DateTime)#1 (3) { 
    ["date"]=> 
    string(26) "2015-03-01 10:00:29.000000" 
    ["timezone_type"]=> 
    int(3) 
    ["timezone"]=> 
    string(3) "UTC" 
} 

Очевидно не изменяя формат для ваших потребностей и извлечения TS с ->getTimestamp.

+0

В основном, это хорошая идея, чтобы проверить формат?. Но тогда я должен реализовать все [форматы DateTime PHP знает] (http://php.net/manual/en/datetime.formats.php) ... – Richard

0

Вы можете использовать DateTime класс для этого.

  1. Создать класс DateTime
  2. Установите Отметка времени
  3. Проверьте время
  4. Если время 00:00:00, добавьте 1 день минус 1 секунда

Пример этого:

<?php 

    $dates = array(
     '01.01.2016', 
     '01.01.2016 00:00:00', 
     '01.01.2016 00:10:00', 
     '01.01.2016 23:59:59', 
     'Jan 1st 2016', 
     'Jan 1st 2016 00:00:00', 
     'Jan 1st 2016 00:10:00', 
     'Jan 1st 2016 11:59:59 pm', 
     '01/01/2016', 
     '01/01/2016 00:00:00', 
     '01/01/2016 00:10:00', 
     '01/01/2016 23:59:59', 
     '2016-01-01 00:00:00', 
     '2016-01-01 00:10:00', 
     '2016-01-01 23:59:59', 
    ); 
    $timestamps = array(); 

    foreach($dates as $date) { 
     $timestamp = strtotime($date); 

     $DateTime = new DateTime(); 
     $DateTime->setTimestamp($timestamp); 

     if($DateTime->format('H:i:s') === '00:00:00') { 
      $timestamp = strtotime($date . ' + 1 day - 1 second'); 
     } 
     $timestamps[] = $timestamp; 
    } 

Выход $timestamps:

Array 
(
    [0] => 1451710799 
    [1] => 1451710799 
    [2] => 1451625000 
    [3] => 1451710799 
    [4] => 1451710799 
    [5] => 1451710799 
    [6] => 1451625000 
    [7] => 1451710799 
    [8] => 1451710799 
    [9] => 1451710799 
    [10] => 1451625000 
    [11] => 1451710799 
    [12] => 1451710799 
    [13] => 1451625000 
    [14] => 1451710799 
) 
+0

Да, но проблема в том, что я хочу знать, было ли задано время. Что делать, если кто-то задал время в явном виде до 00:00:00? ;-) По умолчанию не должно быть 00:00:00, а 23:59:59, чтобы сказать это другими словами. – Richard

0

Судя по предоставленным временным меткам, конверсии эпохи unix, сделанные как входные данные, находятся в режиме GMT. Если это так, вы можете попробовать базовую проверку явно установленного времени с помощью функции gmdate, исходя из предположения, что если они имеют значения, это временная метка пользователя.

Если нет, отметка времени может быть изменена, и к дате можно добавить баланс 23 часа, 59 минут, 59 секунд.

<?php 
    $unixstamp = '1451520000'; // Thu, 31 Dec 2015 00:00:00 GMT 
    $day = gmdate('Y-m-d', $unixstamp); // 2015-12-31 
    $hour = (int)gmdate('H', $unixstamp); // 0 
    $minute = (int)gmdate('i', $unixstamp); // 0 

    //check if hours or minutes have been set explicitly 
if($hour > 0 || $minute > 0){ 
    //User Modified Time 
    echo gmdate("c",$unixstamp); 

} else { 
    //here add the 23 hours and 59 minutes on and return as date object 
    echo gmdate("c", strtotime('+23 hours + 59 minutes + 59 seconds', $unixstamp)); 

    //here add the 23 hours and 59 minutes on and return as unix epoch timestamp 
    $endofday = gmdate("U", strtotime('+23 hours + 59 minutes + 59 seconds', $unixstamp)); 
} 
?> 

Часовые пояса, безусловно, внимание, но приведенный выше код будет проверять отметку времени GMT Unix для явно заданное время.

+0

Да, но проблема в том, что я хочу знать, было ли задано время. Что делать, если кто-то задал время в явном виде до 00:00:00? ;-) По умолчанию не должно быть 00:00:00, а 23:59:59, чтобы сказать это другими словами. – Richard

+0

Правильно, чтобы вы хотели, чтобы время было изменено на конце пользователя? Какой метод имеет пользовательский интерфейс для ввода даты окончания? Я бы посмотрел на ваш передний конец, чтобы получить обратную связь по времени. – RepeatQuotations

+0

У меня есть текстовое поле для даты/времени и попытайтесь разобрать введенное значение с помощью 'strtotime'. Конечно, я могу интегрировать выбор даты ... – Richard

0

По умолчанию все временные метки включают время, даже если оно не установлено, оно будет 00:00:00.

Таким образом, в этом случае, вы могли бы сделать что-то вроде этого:

<?php 

$notime = 1420070400; 
$withtime = 1420110000; 


$time = date("H:i:s", $withtime); 

if($time == "00:00:00") { 
    echo "time not set"; 
} else { 
    echo "time set"; 
} 

>

+0

Да, но проблема в том, что я хочу знать, было ли задано время. Значение по умолчанию не должно быть 00:00:00, а 23:59:59, чтобы сказать это другими словами. – Richard

+0

В этом случае вы можете просто иметь логическое значение при отправке формы, если время было установлено пользователем или нет. Если нет, замените 00:00:00 на 23:59:59 – eselskas

Смежные вопросы