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
отправляемое клиентом значение не является пустым, поэтому я также использую astrlen() <= 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);
Комментарии:
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 «Здесь»; }