当前位置: 首页 > 知识库问答 >
问题:

显示毫秒的Laravel时间戳

后星河
2023-03-14

我需要使用格式“m-d-Y H:I:s.u”(包括毫秒)在laravel应用程序上以高精度的时间戳存储更新的_

根据laravel文档,我可以通过在类上设置$dateFormat属性来自定义日期格式,但是。。。

主要问题是Laravel的模式生成器在数据库中添加了一列类型时间戳,当我使用$table-

有什么办法可以做到这一点吗?

共有2个答案

袁晟
2023-03-14

根据malhal的回答,我能够在这里得到分数时间戳读数。为了方便起见,将答案粘贴在这里:

class BaseModel extends Model
{
    protected $dateFormat = 'Y-m-d\TH:i:s.u';

    protected function asDateTime($value)
    {
        try {
            return parent::asDateTime($value);
        } catch (\InvalidArgumentException $e) {
            return parent::asDateTime(new \DateTimeImmutable($value));
        }
    }

    public function newQuery()
    {
        $query = parent::newQuery();

        if($this->usesTimestamps()) {
            $table = $this->getTable();
            $column = $this->getDeletedAtColumn();

            $query->addSelect(DB::raw("concat($table.$column) as $column"));
        }

        return $query;
    }
}

这里发生了很多事情,因为它使用应用的范围获取查询,然后在末尾为更新的列添加一个select,这将覆盖之前加载的所有更新的列,而Laravel从查询中删除模型。作为一个丑陋的黑客,它在第一次就出人意料地成功了。

时间戳在内部以碳的形式存储在Laravel中:

dd(MyModel->first()->updated_at->format('Y-m-d H:i:s.u'));

输出:

2017-04-14 22:37:47.426131

还要确保运行迁移以将列转换为分数时间戳。微秒精度将时间戳的大小从4字节提高到7字节,但现在是2017年,不要让选择毫秒精度节省一到两个字节在以后为过时的缓存条目提供服务时花掉你一大笔钱:

\DB::statement("ALTER TABLE my_table MODIFY updated_at TIMESTAMP(6) NULL DEFAULT NULL");

遗憾的是,我还没有找到一种方法来修改迁移模式timestamps()函数。

蒋栋
2023-03-14

不能,因为PHP PDO驱动程序不支持时间戳中的小数秒。一种解决方法是选择时间戳作为字符串,这样PDO驱动程序就不知道它实际上是一个时间戳,只需执行$query即可-

// override to include micro seconds when dates are put into mysql.
protected function getDateFormat()
{
    return 'Y-m-d H:i:s.u';
}

最后,在迁移中,而不是在架构回调之外,执行以下操作:

DB::statement("ALTER TABLE `$tableName` ADD COLUMN created_at TIMESTAMP(3) NULL");

注意:这个例子是3位小数,但是如果你愿意的话,你最多可以有6位小数,在alter表格和sprintf中,将3改为6,同时调整6的乘数*1000到1000000。

希望有一天PHP PDO会被更新来解决这个问题,但它已经超过5年了,没有任何变化,所以我没有我的希望了。如果您对详细信息感兴趣,请参阅此错误报告:http://grokbase.com/t/php/php-bugs/11524dvh68/php-bug-bug-54648-new-pdo-forces-format-of-datetime-fields 我在另一个答案中发现了这个链接,它可能会帮助您更好地理解这个问题:https://stackoverflow.com/a/22990991/259521

PHP最近真的显示了它的年龄,我会考虑这个问题是我考虑搬到更现代的No.js的原因之一。

 类似资料:
  • 我正在研究JavaScript。我的时间以毫秒计。所以我必须以PST时区显示时间。我试过GMT。但是是否有任何选项可以显示PST格式的时间,其中输入是以毫秒为单位的,如1671673550214。因此我正在尝试将该毫秒转换为PST的时间和日期格式。与下面的代码相同。恳求帮忙。下面是我试过的代码: 我甚至尝试过使用UTCString()、UTC()和toString();但事情正在被转换成GMT而不

  • 问题内容: 我已经编写了此示例程序,其中我想将日期转换为另一种格式。使用简单的日期格式时,我没有看到预期的日期。 我看到以下输出。第一种是使用简单的日期格式,第二种是手动翻译。 因此,如何使简单的日期格式输出与手动格式类似的值 问题答案: 看来您不能使用6位数字表示毫秒。您的程序关闭了11分17秒。660秒= 11分钟,您可以休息17秒。因此,它只能将您输入的内容从秒转换为分钟,因为它不能接受超过

  • 我从GPS接收机接收到一个时间戳,它以秒后的微秒时间表示:

  • 问题内容: 这是我的代码: 是否可以在日期格式中添加毫秒和纳秒? 问题答案: 您可以通过在末尾添加来添加毫秒数,例如格式为。 毫微秒内没有参考。通常用于性能调试,而不用于显示目的。

  • 问题内容: 在pandas数据框中有一个datetime列,其值如下: 我想知道如何舍入这些值,摆脱毫秒,仅将日期,小时,分钟和00表示为秒,如下所示: 问题答案: 使用与用于分钟设置: 我想将时间值更改为下一个值:

  • 问题内容: 我在Vala中编写一些代码,在那里我将首先获取系统时间,然后创建一个文件,然后检索该文件的时间戳。时间戳记总是早于系统时间,介于500到1500微秒之间,这没有任何意义。 然后,我编写了一个简单的shell脚本: 结果如下: 如您所见,小数点后的前3位(毫秒)似乎可以正常显示,因为它们正在按预期的顺序递增,但是第4位及其后的数字看起来不正确。倒数第4至9位似乎在变慢。我有什么理由吗,尽