solodkiy / date-time
Requires
- php: ^7.4 || ^8.0
- ext-json: *
Requires (Dev)
- php-coveralls/php-coveralls: ^2.2
- phpunit/phpunit: ^9.0
- vimeo/psalm: 5.15.0
Suggests
- ext-timezonedb: This PECL extension provides up-to-date timezone information
Conflicts
Replaces
- brick/date-time: 0.5.5
- dev-master
- v102.x-dev
- 102.1.0
- 102.0.1
- 102.0.0
- 101.2.1
- 101.2.0
- 101.1.1
- 101.1.0
- 101.0.1
- 101.0.0
- 100.1.0
- 100.0.0
- 0.5.1
- 0.5.0
- 0.4.3
- 0.4.2
- 0.4.1
- 0.4.0-p7
- 0.4.0-p6
- 0.4.0-p5
- 0.4.0-p4
- 0.4.0-p3
- 0.4.0-p2
- 0.4.0-p1
- 0.4.0
- 0.3.2-p1
- 0.3.2
- 0.3.1
- 0.3.0
- 0.2.3
- 0.2.2
- 0.2.1
- 0.2.0
- 0.1.16
- 0.1.15
- 0.1.14
- 0.1.13
- 0.1.12
- 0.1.11
- 0.1.10
- 0.1.9
- 0.1.8
- 0.1.7
- 0.1.6
- 0.1.5
- 0.1.4
- 0.1.3
- 0.1.2
- 0.1.1
- 0.1.0
- dev-LocalDateRange_toInterval
- dev-fix_phpdoc
- dev-UtcDateTime
This package is auto-updated.
Last update: 2024-05-03 22:16:34 UTC
README
一组强大的不可变类,用于处理日期和时间。
简介
此库在原生PHP日期时间类的基础上构建了一个广泛的API,并添加了如LocalDate
、LocalTime
、YearMonth
、MonthDay
等缺失的概念。
这些类遵循ISO 8601标准来表示日期和时间概念。
此组件遵循Java的JSR 310(日期和时间API)规范的重要部分。尽管如此,由于技术或实际原因存在一些差异,因此不要期望类和方法名称完全匹配。
所有类都是不可变的,它们可以在不受到影响的情况下安全地传递。
安装
此库可以通过Composer安装。
composer require solodkiy/brick-date-time
要求
此库需要PHP 8.1或更高版本。
关于此分支
虽然此库仍在开发中,但经过良好测试,应该足够稳定,可以在生产环境中使用。
新功能
- 新
UtcDateTime
类 Instant::toUtcDateTime()
方法LocalDateTime::fromSqlFormat()
方法LocalDateTime::toSqlFormat()
方法ZonedDateTime::fromSqlFormat()
方法ZonedDateTime::toSqlFormat()
方法ZonedDateTime::toUtcDateTime()
方法ZonedDateTime::toNativeFormat()
方法ZonedDateTime::toUtcSqlFormat()
方法
与brick/date-time的兼容性
solodkiy/brick-date-time | brick/date-time |
---|---|
103.*.* | 0.6.* |
102.*.* | 0.5.* |
101.*.* | 0.4.* |
100.*.* | 0.3.2 |
概述
主要类
以下类/枚举表示日期时间概念
DayOfWeek
:星期几,如星期一(枚举)Duration
:以秒和纳秒为单位的持续时间Instant
:时间点,精确到纳秒Interval
:两个时间点之间的时间段LocalDate
:如2014-08-31
的独立日期LocalDateRange
:如2014-01-01/2014-12-31
的包含本地日期的范围LocalDateTime
:不带时区的日期时间,如2014-08-31T10:15:30
LocalTime
:如10:15:30
的独立时间Month
:如一月(枚举)的年月MonthDay
:不包含年份的月和日的组合,如--12-31
Period
:基于日期的时间量,如'2年,3个月和4天'TimeZoneOffset
:基于偏移量的时区,如+01:00
TimeZoneRegion
:基于区域的时区,如Europe/London
Year
:公历中的年份YearMonth
:年和月的组合,如2014-08
ZonedDateTime
:带时区的日期时间,如2014-08-31T10:15:30+01:00
。此类在概念上等同于原生的DateTime
类UtcDateTime
:带UTC时区的日期时间,如2014-08-31T10:15:30Z
。此类是ZonedDateTime的子类
这些类属于Brick\DateTime
命名空间。
时钟
所有对象从Clock
实现读取当前时间。以下实现可用
SystemClock
返回系统时间;它是默认时钟FixedClock
:返回预先配置的时间OffsetClock
:将偏移量添加到另一个时钟ScaleClock
:使另一个时钟以比例因子快进
这些类属于 Brick\DateTime\Clock
命名空间。
在您的应用程序中,您可能永远不会触及默认设置,并且始终使用默认时钟
use Brick\DateTime\LocalDate; use Brick\DateTime\TimeZone; echo LocalDate::now(TimeZone::utc()); // 2017-10-04
然而,在您的测试中,您可能需要将当前时间设置为测试已知条件下的应用程序。为此,您可以选择显式地将 Clock
实例传递给 now()
方法
use Brick\DateTime\Clock\FixedClock; use Brick\DateTime\Instant; use Brick\DateTime\LocalDate; use Brick\DateTime\TimeZone; $clock = new FixedClock(Instant::of(1000000000)); echo LocalDate::now(TimeZone::utc(), $clock); // 2001-09-09
或者您可以将所有日期时间类的 默认 时钟更改为。除非提供显式的时钟,否则所有如 now()
之类的所有方法都将使用您提供的默认时钟
use Brick\DateTime\Clock\FixedClock; use Brick\DateTime\DefaultClock; use Brick\DateTime\Instant; use Brick\DateTime\LocalDate; use Brick\DateTime\TimeZone; DefaultClock::set(new FixedClock(Instant::of(1000000000))); echo LocalDate::now(TimeZone::utc()); // 2001-09-09 DefaultClock::reset(); // do not forget to reset the clock to the system clock!
此外,还有一些有用的快捷方法来在测试中使用时钟,灵感来自 timecop
freeze()
将时间冻结到特定的时间点travelTo()
前往时间中的一个Instant
,但允许时间从那里继续前进travelBy()
通过一个Duration
时间段在时间中前进,这可能向前(正值)或向后(负值)scale()
使时间以给定的速度移动
将时间冻结到特定点
use Brick\DateTime\DefaultClock; use Brick\DateTime\Instant; DefaultClock::freeze(Instant::of(2000000000)); $a = Instant::now(); sleep(1); $b = Instant::now(); echo $a, PHP_EOL; // 2033-05-18T03:33:20Z echo $b, PHP_EOL; // 2033-05-18T03:33:20Z DefaultClock::reset();
前往特定的时间点
use Brick\DateTime\DefaultClock; use Brick\DateTime\Instant; DefaultClock::travelTo(Instant::of(2000000000)); $a = Instant::now(); sleep(1); $b = Instant::now(); echo $a, PHP_EOL; // 2033-05-18T03:33:20.000342Z echo $b, PHP_EOL; // 2033-05-18T03:33:21.000606Z DefaultClock::reset();
使时间以给定的速度移动
use Brick\DateTime\DefaultClock; use Brick\DateTime\Instant; DefaultClock::travelTo(Instant::of(2000000000)); DefaultClock::scale(60); // 1 second becomes 60 seconds $a = Instant::now(); sleep(1); $b = Instant::now(); echo $a, PHP_EOL; // 2033-05-18T03:33:20.00188Z echo $b, PHP_EOL; // 2033-05-18T03:34:20.06632Z DefaultClock::reset();
如您所见,您甚至可以将 travelTo()
和 scale()
方法结合使用。
请在每个测试后非常小心地 重置
默认时钟! 如果您使用 PHPUnit,可以在 tearDown()
方法中这样做。
异常
以下异常可能被抛出
- 在执行非法操作时抛出
Brick\DateTime\DateTimeException
- 当
parse()
无效的字符串表示时抛出Brick\DateTime\Parser\DateTimeParseException
Doctrine 映射
您可以在 Doctrine 实体中使用 brick/date-time
类型,使用 brick/date-time-doctrine 包。
贡献
在提交拉取请求之前,您可以使用以下工具检查代码。如果以下任何工具报告了任何问题,您的 CI 构建将失败。
首先,安装依赖项
composer install
单元测试
运行 PHPUnit 测试
vendor/bin/phpunit
静态分析
运行 Psalm 静态分析
vendor/bin/psalm --no-cache
编码风格
在单独的文件夹中安装 Easy Coding Standard
composer install --working-dir=tools/ecs
运行编码风格分析检查
tools/ecs/vendor/bin/ecs check --config tools/ecs/ecs.php
或直接修复发现的问题
tools/ecs/vendor/bin/ecs check --config tools/ecs/ecs.php --fix
Rector 自动重构
在单独的文件夹中安装 Rector
composer install --working-dir=tools/rector
运行自动重构
tools/rector/vendor/bin/rector --config tools/rector/rector.php