#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 .