owlcorp/doctrine-microseconds-datetime

为 Doctrine ORM 和 Doctrine DBAL 添加对微秒时间格式的支持

v0.9.0 2023-01-10 09:25 UTC

This package is auto-updated.

Last update: 2024-09-10 13:30:17 UTC


README

这是关于什么的?

这个库没有花哨的标志。它也没有所有酷炫的徽章,但它拥有一个简单且现成的 Doctrine ORM/DBAL 的毫秒和微秒类型的实现。

为什么?

日期和时间很难,数据库也很复杂——两者的结合简直是噩梦。有一个 5 年以上的问题 描述了这个问题。在所有平台上正确实现似乎几乎是不可能的。然而,在有限范围内是可以实现的。这就是创建这个包的原因:多年来,我 本人 多次涉足这个问题,现在是时候停止复制粘贴相同的代码了。

如何使用?

  1. 使用 composer 安装: composer require owlcorp/doctrine-microseconds-datetime (它将在 PHP7.0-8+ 上工作)
  2. 添加 DBAL 类型
  • 如果您正在使用 Symfony,请编辑 config/packages/doctrine.yaml 并添加
    doctrine:
        dbal:
            types:
                time_micro: OwlCorp\DoctrineMicrotime\DBAL\Types\TimeMicroType
                time_immutable_micro: OwlCorp\DoctrineMicrotime\DBAL\Types\TimeImmutableMicroType
                datetime_micro: OwlCorp\DoctrineMicrotime\DBAL\Types\DateTimeMicroType
                datetime_immutable_micro: OwlCorp\DoctrineMicrotime\DBAL\Types\DateTimeImmutableMicroType
                datetimetz_micro: OwlCorp\DoctrineMicrotime\DBAL\Types\DateTimeTzMicroType
                datetimetz_immutable_micro: OwlCorp\DoctrineMicrotime\DBAL\Types\DateTimeTzImmutableMicroType
  • 如果您不使用 Symfony,请查看官方 Doctrine 文档
  1. 对于 ORM,您可以使用它如下

    <?php declare(strict_types=1);
    
    use Doctrine\ORM\Mapping as ORM;
    
    #[ORM\Entity]
    class MicroEntity
    {
        #[ORM\Column(type: 'time_micro')] //you can use text names
        public \DateTime $time;
    
        #[ORM\Column(type: TimeImmutableMicroType::NAME)] //or constants
        public \DateTimeImmutable $timeImmutable;
    
        /**
         * @ORM\Column(type="datetime_micro") Of course, it works with annotations too
         */
        public \DateTime $dateTime;
    }

支持什么?

请参阅下表。这些都是我能测试的组合,并且应该涵盖大多数用例。如果您知道其他支持它的数据库引擎并且可以轻松确认,欢迎提交问题 :)

✅ = 完全支持微秒 (.000000) | ⚠️ = 仅支持毫秒 (.000) | ❌ = 不支持

注意事项

  1. SQLite 不支持本机 TIME/DATETIME 字段,但内部函数支持基于文本的表示,精度为毫秒。
  2. 旧版的 PgSQL 在某些边缘情况下可能会丢失一些精度,您不太可能遇到 非 Y2K 年 2000 年错误
  3. 额外优惠:是的,大多数数据库中的时区支持都是破绽百出的。即使在支持的情况下,您可能也不应该 使用它

来源