Свойство Carbon timestamp возвращает неправильную дату в миллисекундах

Я пытаюсь вернуть дату, проанализированную в текущем часовом поясе сервера (хранится в формате 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 (и последовательные числа каждый раз, когда я выполняю метод), поэтому:

  • Первое исполнение: 1577113515
  • Второе исполнение: 1577113525
  • Третье исполнение: 1577113548
  • И так далее...

Хотя временная метка представляет правильную дату в формате 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)

Временные метки PHP указаны в секундах, а не в миллисекундах, поэтому преобразование с этим веб-сайтом не будет работать, если вы не добавите 3 0 в конец.

aynber 23.12.2020 16:22

Попробуйте это date("Y-M-d H:i:s", $date->timestamp);

STA 23.12.2020 16:24

@aynber Спасибо! Я этого не знал. Я собираюсь обновить вопрос. Теперь метка времени указана в правильном году, месяце и дате, но каждый раз, когда я выполняю метод, у меня есть это приращение.

sebastian_mp 23.12.2020 16:46

@sta Проверьте ожидаемый результат в моем вопросе. date("Y-M-d H:i:s", $date->timestamp); возвращает дату в строковом формате.

sebastian_mp 23.12.2020 17:09

Вы создаете полное время только из даты, поэтому оно будет использовать текущее время для времени. Поэтому, если вы запустите его в 11:34, он будет использовать 11:34 для времени независимо от того, какой сегодня день. Затем запустите его снова через 10 минут, отметка времени теперь будет 11:44. Если вы хотите, чтобы в начале дня было 0 с, вы можете изменить свой объект с помощью $date->startOfDay()

aynber 23.12.2020 17:20

Да, это то, о чем я думал. Спасибо!

sebastian_mp 23.12.2020 17:25

Так в основном, вам нужно $date->timestamp * 1000?

El_Vanja 23.12.2020 18:01
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
7
911
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Давайте попробуем это, это должно сработать для вас

$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,
    ];
}

Вы отправляете отформатированную дату под ключом часового пояса... не имеет особого смысла.

El_Vanja 23.12.2020 16:28

$date->format('Y-m-d) не возвращает отметку времени, она возвращает отформатированную строку даты, и мне нужна отметка времени.

sebastian_mp 23.12.2020 16:54

Вы можете написать ожидаемый результат?

azibom 23.12.2020 16:57

Конечно, я добавлю это в вопрос.

sebastian_mp 23.12.2020 17:00

пожалуйста, добавьте это в свой вопрос

azibom 23.12.2020 17:01

Используйте !:

$date = Carbon::createFromFormat(
    '!Y-m-d',
    $stringDate,
    config('app.timezone')
);

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

createFromFormat — это нативная функция PHP, и по умолчанию она принимает текущее время (текущее значение единиц, которые вы не указываете), если используется префикс !, она принимает минимальное значение для каждой (то есть 0 для часов/минут/секунд).

Другие вопросы по теме