assoconnect/php-date

处理无时间的PHP对象

v2.12.0 2023-11-02 15:33 UTC

README

Build Status Quality Gate Status

为什么使用此对象?

PHP有DateTime类来处理日期和时间,但没有仅处理日期的对象。

DateTime实例代表一个精确的时间点,并嵌入一个DateTimeZone实例,以将底层的时间戳格式化为更易读的格式。

另一方面,日期可能有两种含义

  1. 从早上00:00:00开始,到晚上23:59:59结束的24小时周期。实际上,一天可能持续少于或多于24小时,例如,考虑在夏令时调整时钟的一天,但你应该明白:这个日期实际上是两个不同的DateTime实例之间的间隔。这个间隔在您穿越世界时会改变:例如,日期在洛杉矶比在巴黎晚大约8个小时。
  2. 对一天的一个简单的参考,不关心时区。想想你的生日,无论你在地球上的哪个地方旅行,你都不会改变它:你只保留你在出生地的那个。

这个PHP AbsoluteDate对象代表第二种用例中的日期。

为什么不使用DateTime呢?

DateTime是一个令人惊叹的类,实际上这个AbsoluteDate类依赖于它。

但是,当处理第二种用例时,您不关心时间或时区。

如果不正确处理,使用DateTime可能会导致问题。

它还有助于清楚地识别您是在处理一个真实的时间点还是仅仅一个松散的日期。

如何使用它?

此类公开两种实例化AbsoluteDate对象的方法

  1. 使用构造函数,您使用默认的日期格式Y-m-d获取一个AbsoluteDate实例。如果没有给出,则使用UTC时区的当前日期。
  2. 使用AbsoluteDate::createInTimezone(\DateTimeZone $timezone, \DateTimeInterface $datetime = null),您在给定时区中获取给定DateTime实例的当前日期。

AbsoluteDate::format(string $format)方法可以帮助您以所需的方式格式化日期。它依赖于DateTime类的格式化方法,因此它支持与PHP date()函数相同的格式。

AbsoluteDate::startsAt(\DateTimeZone $timezone)AbsoluteDate::endsAt(\DateTimeZone $timezone)方法返回给定时区的DateTime对象。startsAt返回一个00:00:00的DateTime,而endsAt返回一天结束时的DateTime(23:59:59)。

示例

使用AbsoluteDate与DateTime

<?php

// A given point in time
$datetime = new \DateTime('@0'); // 1970-01-01 00:00:00+00:00

// The date was 1970-01-01 in Paris at the Epoch time
\AbsoluteDate::createInTimezone(new \DateTimeZone('Europe/Paris'), $datetime); // 1970-01-01

// The date was still 1969-12-31 in Los Angeles at the same point in time
\AbsoluteDate::createInTimezone(new \DateTimeZone('America/Los_Angeles'), $datetime); // 1969-12-31

使用AbsoluteDate与日期字符串

<?php
// Default Y-m-d format
new \AbsoluteDate('1970-01-01'); // 1970-01-01

// Custom format
new \AbsoluteDate('1970/01/01', 'Y/m/d'); // 1970-01-01

路线图

  1. 为第一种用例创建RelativeDate对象,公开startsAtendsAt方法