firehed/clock

PSR-20 时钟实现

1.0.0 2024-03-26 19:17 UTC

This package is auto-updated.

Last update: 2024-08-27 19:37:17 UTC


README

一个 PSR-20 时钟实现,支持时间配置和移动,可用于单元测试。

Test Static analysis Lint codecov

安装

composer require firehed/clock

使用

一般来说,ClockInterface 仅在与依赖注入结合使用时才有用。这允许单元测试提供一个设置为特定时间点的测试时钟,而实际应用则连接到使用真实时钟并遵循实际时间的系统。

真实时钟

当调用 ->now() 时,真实时钟将返回当前系统时间。它正常前进,其行为与直接调用 time()new DateTimeImmutable() 相同。

这就是您应该在实际应用代码中使用的内容。

use Firehed\Clock\Clock;

$clock = new Clock();

重要

在“真实时钟”模式下,时钟不能被移动,如果您尝试这样做,将会抛出异常。

测试时钟

测试时钟将返回指定的时间,并且可以手动移动。它将不会像实际墙上的时间一样自动前进(例如,不受 sleep() 等影响)。这主要用于测试用例,例如

  • 验证或调整查询中的日期范围
  • 确保过期行为按预期工作
  • 验证速率限制行为

基本上,如果您通常需要使用 sleep() 来检查某些内容,您可以通过移动测试时钟特定的数量或到指定的时间来继续测试用例,就像那个时间已经过去一样。这可以使测试运行更快、更可靠,无需担心“加减一秒”的逻辑。

use Firehed\Clock\Clock;

$clock = new Clock($timeOrOffset);

// ...

$clock->moveTo($otherTimeOrOffset);

$timeOrOffset$otherTimeOrOffset 的行为如下

警告

float 值在接近当前时间的戳记附近可能会丢失精度,并且通常会丢失精度。如果您的测试需要亚秒级行为,请优先选择更具体的格式。

Unixtime 字符串避免了浮点精度问题。这些是 @ 后跟时间戳;例如 '@1234567890.987654'

库不保证测试时钟后续对 ->now() 的调用是相同的或不同的 DateTimeImmutable 实例。然而,它们保证引用的是同一个时间点。

提示

如果您只关心相对移动,测试时钟可以设置为 new Clock('now')。您还可以仅使用接近 Unix 纪元的较小值(例如 020);如果您的应用程序一致地使用 ClockInterface,它应该仍然工作,并且像当前时间是 1970 年一样运行。

向后移动时钟

相对时间变化始终使用 DateTimeImmutable->add() 或等效内部操作。

要向后移动时钟

  • 传递一个 DateInterval,其中 invert 设置为 1
  • 传递任何在当前设置值之前的绝对时间戳等效值

时区

此库目前不旨在处理任何时区特定问题,并将默认为系统配置。如果您的需求包括关于时区的特定行为,请确保提供包含时区信息的值。

贡献

请在 GitHub 上报告任何错误或功能请求。请注意,这被认为主要已完成功能,因此可能会拒绝功能请求。