strtotime() возвращает дату 1970 года и плохо сравнивает со time()

php

#php

Вопрос:

Я пытаюсь преобразовать строку, которая вводится в мою программу, из a JSON в a date , чтобы я мог сравнить ее с фактическим временем.
Я использую strtotime() , но он преобразует исходную дату в 01/01/1970 12:00:00 .
Вот мой код:

 var_dump($requestOrder->date);
$requestDate= date('d/m/Y h:i:s', strtotime($requestOrder->date));
var_dump($requestDate);
 

Где date внутри $requestOrder равно "24/12/2021 00:00:00" .
И вот что я получаю:

 string(19) "24/12/2021 00:00:00"
string(19) "01/01/1970 12:00:00"
 

Мне нужно преобразовать его в a date , потому что в последнее время в какой-то момент моего кода я делаю это:

 if($requestDate< date('d/m/Y h:i:s', time())) {
    ...
}
 

Я перепробовал множество вариантов решения этой проблемы, таких как изменение / на - , использование других форматов для даты и т.д., Но безуспешно. В случае использования a str_replace для изменения / to - он работает и не показывает дату 70-х годов, но тогда он плохо выполняет сравнение, он всегда определяет дату, наименьшую из фактических.
Кто-нибудь видит, что я пропускаю?

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

1. Прочитайте заметки, сделанные этим пользователем , в официальном документе.

2. strtotime преобразует действительную временную строку в nubmer временной метки, date форматирует временную метку в строку с предоставленным форматом. Указанный вами формат date не влияет strtotime и, поскольку d/m/Y H:i:s он не является допустимым форматом strtotime , он возвращает false

3. Если формат ввода всегда один и тот же, вам следует лучше использовать DateTime::createFromFormat (который способен работать с форматом, который strtotime не может быть прочитан) и работать с DateTime объектами

4. Кроме того, зачем вы сравниваете строки, если вы могли бы лучше сравнивать временные метки или правильные объекты даты?

5. @NicoHaase работает со строками, потому что мой код постоянно отправляет и получает даты, а способ их получения — по строкам, поэтому мне было проще работать с этим форматом вместо того, чтобы тратить много времени (и вычислений) на преобразование строк в DateTime объекты, а затем снова превращать их в строки, чтобы вернуть егоклиенту. И поскольку еще одно условие, которое мне нужно проверить, заключается в том, что date field отправляемое клиентом значение не является пустым, поэтому я также использую a strlen() <= 0 в условии.

Ответ №1:

date() Функция возвращает строку, а не объект DateTime. Было бы лучше использовать фактический DateTime класс и его createFromFormat функцию.

 $requestDate = date_create_from_format('d/m/Y h:i:s', $requestOrder->date);
 

или объектно-ориентированный стиль

 $requestDate = DateTime::createFromFormat('d/m/Y h:i:s', $requestOrder->date);
 

https://www.php.net/manual/en/datetime.createfromformat.php

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

1. Преобразование строк в DateTime объект также является хорошим вариантом. Но это не то, что мне нужно делать в этом случае, потому что мне нужно выполнить некоторые другие сравнения, которые нуждаются в них strings . Тем не менее, я думаю, что этот ответ может быть полезен для других пользователей в подобных ситуациях, как у меня.

Ответ №2:

Пожалуйста, проверьте приведенный ниже код:

 $requestOrder->date="24/12/2021 00:00:00";
$date=str_replace("/",'-',$requestOrder->date);  
if(strtotime($date)>time())
{
   //this will  execute as request date is greater than current date
}
if(strtotime($date)<time())
{
   //this will not execute as current date less than request date
}
 

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

1. Да, это помогает мне преобразовать строку в реальную dateTime вместо даты 1970 года, но при выполнении сравнения программа всегда обнаруживает меньше фактического времени, независимо от того, какую дату я сравниваю с фактической.

2. @FourBars при проверке состояния мы использовали if(strtotime($date)<time()) , это работает

3. Дата, которую вы проверяете, равна 24/12/2021 00:00:0, а текущая дата — 28/10/2021, поэтому она не входит в условие, вам нужно использовать «>», чтобы перейти в условие.

4. Использование > внутренних условий преобразует все даты в действительные, независимо от того, больше они или медленнее фактической…

5. смотрите, я изменил дату на меньшую, чем текущий 2020 год, ее рабочий $requestOrder->дата=»24/12/2020 00:00:00″; $ дата=str_replace(«/»,’-‘,$ requestOrder->дата); if(strtotime($date)>time()) {echo «Здесь»; }