Я пытаюсь вернуть дату, проанализированную в текущем часовом поясе сервера (хранится в формате UTC), только на основе дня, месяца и года. По этой причине у меня есть функция, которая выглядит так:
private function getFormattedDate(string $stringDate): array
{
$date = Carbon::createFromFormat(
'Y-m-d',
$stringDate,
config('app.timezone')
);
return [
'date' => $date->timestamp,
'timezone' => $date->timezoneName,
];
}
Проблема в том, что всегда ключ 'date'
в массиве получает, например, 1577113131 (и последовательные числа каждый раз, когда я выполняю метод), поэтому:
Хотя временная метка представляет правильную дату в формате Y-m-d, изменение при каждом выполнении метода не должно происходить.
Итак, как я могу решить эту проблему и получить отметку времени в миллисекундах? Я напечатал то, что находится в объекте 'date'
Carbon, и, кажется, у него есть правильная информация о дате:
^ Carbon\Carbon @1577113734 {#1048
#constructedObjectId: "00000000212d5614000000005c7c5f51"
#localMonthsOverflow: null
#localYearsOverflow: null
#localStrictModeEnabled: null
#localHumanDiffOptions: null
#localToStringFormat: null
#localSerializer: null
#localMacros: null
#localGenericMacros: null
#localFormatFunction: null
#localTranslator: null
#dumpProperties: array:3 []
#dumpLocale: null
date: 2019-12-23 10:08:54.0 America/Bogota (-05:00)
}
Ожидаемый результат:
'date' => 1577113734000,
'timezone' => 'America/Bogota'
С учетом даты: 2019-12-23 10:08:54.0 America/Bogota (-05:00)
Попробуйте это date("Y-M-d H:i:s", $date->timestamp);
@aynber Спасибо! Я этого не знал. Я собираюсь обновить вопрос. Теперь метка времени указана в правильном году, месяце и дате, но каждый раз, когда я выполняю метод, у меня есть это приращение.
@sta Проверьте ожидаемый результат в моем вопросе. date("Y-M-d H:i:s", $date->timestamp);
возвращает дату в строковом формате.
Вы создаете полное время только из даты, поэтому оно будет использовать текущее время для времени. Поэтому, если вы запустите его в 11:34, он будет использовать 11:34 для времени независимо от того, какой сегодня день. Затем запустите его снова через 10 минут, отметка времени теперь будет 11:44. Если вы хотите, чтобы в начале дня было 0 с, вы можете изменить свой объект с помощью $date->startOfDay()
Да, это то, о чем я думал. Спасибо!
Так в основном, вам нужно $date->timestamp * 1000
?
Давайте попробуем это, это должно сработать для вас
$format = 'Y-m-d';
$date = Carbon::createFromFormat($format, '2009-02-15');
$nowInMilliseconds = (int) ($date->timestamp . str_pad($date->milli, 3, '0', STR_PAD_LEFT));
echo $nowInMilliseconds;
И вы можете изменить свой пример следующим образом:
private function getFormattedDate(string $stringDate): array
{
$date = Carbon::createFromFormat(
'Y-m-d',
$stringDate,
config('app.timezone')
);
$dateInMilliseconds = (int) ($date->timestamp . str_pad($date->milli, 3, '0', STR_PAD_LEFT));
return [
'date' => $dateInMilliseconds,
'timezone' => $date->timezoneName,
];
}
Вы отправляете отформатированную дату под ключом часового пояса... не имеет особого смысла.
$date->format('Y-m-d)
не возвращает отметку времени, она возвращает отформатированную строку даты, и мне нужна отметка времени.
Вы можете написать ожидаемый результат?
Конечно, я добавлю это в вопрос.
пожалуйста, добавьте это в свой вопрос
Используйте !
:
$date = Carbon::createFromFormat(
'!Y-m-d',
$stringDate,
config('app.timezone')
);
https://www.php.net/manual/en/datetime.createfromformat.php
createFromFormat
— это нативная функция PHP, и по умолчанию она принимает текущее время (текущее значение единиц, которые вы не указываете), если используется префикс !
, она принимает минимальное значение для каждой (то есть 0 для часов/минут/секунд).
Временные метки PHP указаны в секундах, а не в миллисекундах, поэтому преобразование с этим веб-сайтом не будет работать, если вы не добавите 3 0 в конец.