【发布时间】:2021-04-02 05:06:42
【问题描述】:
我正在尝试仅根据日、月和年返回解析为当前服务器时区(以 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,否则无法使用该网站进行转换。
-
试试这个
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()修改您的对象
标签: php laravel php-carbon