PHP - дата как неправильный тип данных - PullRequest
0 голосов
/ 09 декабря 2011

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

function before($test,$bar) {
    $test   = date_create($test);
    $bar    = date_create($bar);

    $diff   = date_diff($bar,$test);

    $diff   = $diff->format('%r%a') * 1;

    return $diff<0;
}

Он отказывается признать, что дата, сгенерированная следующими средствами:

date('m-d-Y', strtotime($date));

... - это не что иное, как БУЛЕ.Если я выведу результат, он выйдет в виде строки, но - с PHP, которая меня смущает - before() воспринимает его как нечто, чем оно не является.Здесь НИЧЕГО не должно быть преобразовано в логическое значение.Я могу напрямую подать ему строку, и она отлично работает.Дайте ему дату из фрагмента кода, специально созданного для этой цели, ну, у нас не может быть этого, потому что ...

Warning: date_diff() expects parameter ... to be DateTime, boolean given

Я подумал: "Хорошо, я дам вам вашжелание парсера. "

function before($test,$bar) {
    $test   = new DateTime(date('Y-m-d',strtotime($test)));
    $bar    = new DateTime(date('Y-m-d',strtotime($bar)));

    $diff   = $bar->diff($test);

    $diff   = $diff->format('%r%a') * 1;

    return $diff<0;
}

Никаких изменений в результате.Я дал ему то, что он хотел, или, по крайней мере, то, что он сказал он хотел (я думаю), и он все еще отвергает меня.Кодирование имитирует реальность.

Мне пока не очень комфортно с датами.Я также не очень доволен тем, как PHP обрабатывает время года.Любой совет?А может быть, как заставить это работать тоже?

Редактировать

Запуск var_dump($test)

object(DateTime)#7 (3) {
  ["date"]=>
      string(19) "1970-01-01 00:00:00"
  ["timezone_type"]=>
      int(3)
  ["timezone"]=>
      string(13) "Europe/Berlin"
}

Ответы [ 5 ]

1 голос
/ 15 августа 2013

Я знаю, что это может быть довольно устаревшим, но я думаю, что следующее может помочь вам, это помогло мне ...

 $interval = date_diff(date_create($strStartDate), date_create($strEndDate));
 echo $interval->format('%R%a days');

Где

 $strStartDate = your starting date
 $strEndDate = your ending date

$interval вернет разницу, а приведенное ниже утверждение формата добавит + или - в соответствии с разницей.

Надеюсь, это поможет вам

Привет

Husnain

1 голос
/ 13 декабря 2011

Как объяснено в руководстве, date_create () является псевдонимом для DateTime :: __ construct () .И там мы можем прочитать:

Возвращаемые значения
Возвращает новый экземпляр DateTime.Процедурный стиль возвращает FALSE при сбое.

Так что довольно ясно, откуда булево значение.

Теперь ваш код показывает много преобразований из метки времени Unix в строку и наоборот, но не в значениеВы начинаете с, поэтому невозможно указать точный источник проблемы.Но я бы сказал, что у вас есть определенная путаница в отношении типов данных, связанных с обработкой дат.Вот небольшая сводка:

  • Отметка времени Unix: это целое число, которое подсчитывает количество секунд с начала эпохи Unix (январь 1970 г.).Это значение обрабатывается устаревшими функциями даты, которые получают целое число в качестве аргумента или возвращают его.

  • DateTime: это новая объектно-ориентированная функция даты, представленная в PHP / 5.2.

  • Строки: это не стандартный формат как таковой, поэтому его следует использовать только для целей отображения или в качестве промежуточного формата (например, для вставки даты в базу данных).

К сожалению, конструктор DateTime принимает только строки и даже не позволяет определить точный формат (ИМХО, не очень продуманное дизайнерское решение).Чтобы уменьшить потенциальную неоднозначность (10/11/2011 10 ноября или 11 октября?), Я предлагаю вам использовать формат "YYYY-MM-DD".

Совет: решите, использовать ли метки времени или объекты DateTime и придерживаться этого,Это сделает вашу жизнь проще.

0 голосов
/ 09 декабря 2011

Вы должны var_dump($test, $bar) до и после того, как вы установите их, чтобы увидеть, есть ли у вас на самом деле даты.Я бы предположил, что даты созданы, так как вы ничего не упомянули о $bar->diff($test) выдаче ошибок «не объект».Предполагая, что логическое значение, о котором вы говорите, является результатом вызова before(), этого следует ожидать, когда вы выполняете операцию, возвращающую логическое значение.

0 голосов
/ 09 декабря 2011

new DateTime($var); возвращает false, когда не может понять смысл ввода.

Попробуйте var_dump все ваши переменные, также будет указан тип (data / string / boolean)

0 голосов
/ 09 декабря 2011

Проверьте ваши типы с var_dump(). Посмотрите, что это говорит:

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