【问题标题】:Carbon timestamp property returns wrong date millis碳时间戳属性返回错误的日期毫秒
【发布时间】: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


【解决方案1】:

使用!:

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

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

createFromFormat 是一个原生 PHP 函数,默认情况下它采用当前时间(您未指定的单位的当前值),如果使用 ! 前缀,则每个都采用最小值(因此 0 表示小时/分钟/秒)。

【讨论】:

    【解决方案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,
        ];
    }
    

    【讨论】:

    • 您在时区键下发送格式化日期...没有多大意义。
    • $date->format('Y-m-d) 不返回时间戳,它返回格式化的日期字符串,我需要时间戳。
    • 你能写出你期望的输出吗?
    • 好的,我会在问题中添加它。
    • 请在您的问题中添加
    猜你喜欢
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 2011-08-02
    • 2022-01-07
    • 2020-11-02
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    相关资源
    最近更新 更多