strtotime() преобразует несуществующую дату в другую дату

#php #function #date #strtotime

#php #функция #Дата #strtotime

Вопрос:

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

Предположим, что пользователь вводит некоторые неправильные значения, а дата «31-02-2012» не существует, тогда я должен получить false return . Но здесь он преобразует ее в другую дату поблизости. Точно в: «02-03-2012»..

Я не хочу, чтобы это произошло..

 $str = "31-02-2012";
echo date("d-m-Y",strtotime($str)); // Outputs 02-03-2012
  

Кто-нибудь может помочь? Я не хочу, чтобы временная метка возвращалась, если дата не является оригинальной.

Комментарии:

1. Я думаю, что это на самом деле правильное и документированное поведение, которое вы описываете. Можете ли вы написать, в чем заключается ваша реальная проблема? Вам нужно проверить строку даты?

Ответ №1:

Вы можете посмотреть checkdate .

Ответ №2:

Это strtotime() связано с проблемами - , поскольку они используются для обозначения фразы типа -1 week и т. Д…

Попробуйте

 $str = '31-02-2012';
echo date('d-m-Y', strtotime(str_replace('-', '/', $str)));
  

Однако 31-02-2012 это недопустимый английский формат, он должен быть 02-31-2012 .


Если у вас PHP> = 5.3, вы можете использовать createFromFormat :

 $str = '31-02-2012';
$d = DateTime::createFromFormat('d-m-Y', $str);
echo $d->format('d-m-Y');
  

Комментарии:

1. Я думаю, вы обнаружите, что английский (как и в Англии, и в большинстве других мест, если на то пошло) формат dd mm yy . Это будет бит cyan здесь: en.wikipedia.org/wiki/Date_format_by_country . Только США настаивают на нелепом формате 🙂

2. @paxdiablo Ну, strtotime в документах утверждается, что это «превратит любое текстовое описание даты и времени на английском языке в временную метку Unix» . Это английский формат, о котором я говорил. 🙂

3. awsome bro .. замена «-» на «/» заставила меня работать.. однако createFromFormat не работает в моем конце, и моя версия php 5.3.5 .. требуется ли для этого еще более высокая версия?

4. @mithunsatheesh Нет, это достаточно высокая версия. DateTime является частью ядра PHP начиная с PHP 5.2, а функция createFromFormat — с 5.3, поэтому она должна быть доступна. Если вы поделитесь получаемой ошибкой или поведением, мы могли бы помочь объяснить, почему это не сработало.

5. @Shef PHP 5.3.2 здесь . DateTime::createFromFormat() выдает мне текущую временную метку при проверке 31.02.2012.

Ответ №3:

Вам нужно будет проверить, возможна ли дата, прежде чем использовать strtotime. Strtotime преобразует его в дату unix, что означает, что с тех пор он будет использовать секунды… Это означает, что это всегда будет дата.

Ответ №4:

Вы можете обойти это поведение

 <?php
$str = "31-02-2012";
$unix = strtotime($str); 
echo date('d-m-Y', $unix);
if (date('d-m-Y', $unix) != $str){
   echo "wrong";
}
else{
   echo date("d-m-Y", $unx);
}
  

или просто используйте checkdate()

Ответ №5:

Используйте функцию checkdate .

 $str = "31-02-2012";
$years = explode("-", $str);
$valid_date = checkdate($years[1], $years[0], $years[2]);
  

Функция проверки даты — Руководство по PHP amp; Функция разнесения — Руководство по PHP

Ответ №6:

Объедините date_parse и checkdate, чтобы проверить, действительно ли это время.

 <?php
date_default_timezone_set('America/Chicago');

function is_valid_date($str) {
    $date = date_parse($str);
    return checkdate($date['month'], $date['day'], $date['year']);
}

print is_valid_date('31-02-2012') ? 'Yes' : 'No';
print "n";
print is_valid_date('28-02-2012') ? 'Yes' : 'No';
print "n";
  

Несмотря на то, что этот формат даты является приемлемым в соответствии с форматами даты PHP, он все равно может вызвать проблемы для анализаторов даты, потому что легко перепутать месяц и день. Например 02-03-2012 , трудно определить, является ли 02 месяцем или днем. Лучше использовать другие, более конкретные примеры анализатора дат здесь, чтобы сначала проанализировать дату, а затем проверить ее с помощью checkdate .