owlcorp / doctrine-microseconds-datetime
为 Doctrine ORM 和 Doctrine DBAL 添加对微秒时间格式的支持
v0.9.0
2023-01-10 09:25 UTC
Requires
- php: ^7.0|^8.0
- doctrine/dbal: >=v2.5.0
Requires (Dev)
- phpstan/phpstan: ^1.9
- phpstan/phpstan-deprecation-rules: ^1.0
- phpstan/phpstan-doctrine: ^1.3
- phpstan/phpstan-strict-rules: ^1.4
- roave/security-advisories: dev-latest
- slevomat/coding-standard: ^8.7
README
这是关于什么的?
这个库没有花哨的标志。它也没有所有酷炫的徽章,但它拥有一个简单且现成的 Doctrine ORM/DBAL 的毫秒和微秒类型的实现。
为什么?
日期和时间很难,数据库也很复杂——两者的结合简直是噩梦。有一个 5 年以上的问题 描述了这个问题。在所有平台上正确实现似乎几乎是不可能的。然而,在有限范围内是可以实现的。这就是创建这个包的原因:多年来,我 本人 多次涉足这个问题,现在是时候停止复制粘贴相同的代码了。
如何使用?
- 使用 composer 安装:
composer require owlcorp/doctrine-microseconds-datetime
(它将在 PHP7.0-8+ 上工作) - 添加 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 文档。
-
对于 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
) | ❌ = 不支持
注意事项
- SQLite 不支持本机
TIME
/DATETIME
字段,但内部函数支持基于文本的表示,精度为毫秒。 - 旧版的 PgSQL 在某些边缘情况下可能会丢失一些精度,您不太可能遇到 非 Y2K 年 2000 年错误。
- 额外优惠:是的,大多数数据库中的时区支持都是破绽百出的。即使在支持的情况下,您可能也不应该 使用它。
来源