prokki/ext-datetime

扩展了常见的 PHP DateTime 对象,添加了许多有用的方法。

0.0.0 2019-07-31 14:00 UTC

This package is auto-updated.

Last update: 2024-09-29 06:02:37 UTC


README

LICENSE Packagist LICENSE PHP v7.3 codecov Build Status

扩展了原生 datetime 对象(\DateTime\DateTimeImmutable)并添加了许多有用的方法。

大多数新方法都是现有功能的快捷方式。但如果需要处理大量的日期和时间操作,这些方法将帮助您节省时间和代码。

所有新方法都支持 方法链

目录

要求

必须使用 PHP v7.3

集成

请通过 composer 安装。

composer require prokki/ext-datetime "^0.0"

使用

ExtDateTime/DateTimeExtDateTime/DateTimeImmutable 的类及其实例可以像原生 datetime 对象/类一样使用。

示例

use ExtDateTime\DateTime;
use ExtDateTime\DateTimeImmutable;

// create a datetime object
$dateTime = new DateTime("now");

// create an immutable datetime object
$dateTimeImmutable = new DateTimeImmutable("now");

静态初始化

与原生对象类似,还有几种其他方式可以创建 datetime 对象。

所有静态方法都可以用于实现 方法链

create()

使用静态构造函数 create() 立即启用链式调用。

use ExtDateTime\DateTime;

// create a datetime object
// and use chaining immediately
$dateTime = DateTime::create("now")
            ->addHours(5)
            ->addDays(5)
            ;

current()

静态构造函数 current() 返回一个包含当前日期/时间的 datetime 对象。但与 DateTime::create("now") 不同,此方法返回的对象具有额外的微时间。

use ExtDateTime\DateTime;

$currentMicroseconds = DateTime::current()->format("u");         // output example 654321
$noMicroseconds      = DateTime::create("now")->format("u");     // output always 000000

createFromObject()

从任何实现 DateTimeInterface 的 datetime 对象创建新对象。

use ExtDateTime\DateTimeImmutable;

// create an immutable datetime object from a native non-immutable object
$datetime = DateTimeImmutable::createFromObject(new \DateTime());

克隆

两种新方法添加了在克隆对象后直接使用链式调用的功能。

duplicate()

此方法只是 clone 的包装函数。

use ExtDateTime\DateTime;

// create a datetime object
$datetime = DateTime::current();

// clone the datetime object and proceed like usual with chaining
$clone = $datetime->duplicate()
         ->addHours(5)
         ->addDays(5)
         ;

toImmutable() / toMutable()

除了使用静态构造函数(DateTime::createFromImmutableDateTimeImmutable::createFromMutable)外,还可以使用这些新的非静态方法。

use ExtDateTime\DateTime;

// create a datetime object
$datetime = DateTime::current();

$clonedImmutable = $datetime->toImmutable();       // only available in class DateTime

$clonedMutable   = $clonedImmutable->toMutable();  // only available in class DateTimeImmutable

操作

大多数新方法都是简化的,以避免在您的代码中重新初始化必要的参数。

addHours() / subHours()

为 datetime 对象添加或减去小时。

use ExtDateTime\DateTime;

// create a datetime object and add 10 hours
$datetimeFuture = DateTime::create("2020-07-30 12:35:17")
                  ->addHours(10)
                  ->format("Y-m-d h:i:s");                   // "2020-07-30 22:35:17"

// create a datetime object and subtracts 10 hours
$datetimeFuture = DateTime::create("2020-07-30 12:35:17")
                  ->subHours(10)
                  ->format("Y-m-d h:i:s");                   // "2020-07-30 02:35:17"

addDays() / subHours()

为 datetime 对象添加或减去天数。

use ExtDateTime\DateTime;

// create a datetime object and add 10 days
$datetimeFuture = DateTime::create("2020-07-30 12:35:17")
                  ->addDays(10)
                  ->format("Y-m-d h:i:s");                   // "2020-08-09 22:35:17"

// create a datetime object and subtracts 10 days
$datetimeFuture = DateTime::create("2020-07-30 12:35:17")
                  ->subDays(10)
                  ->format("Y-m-d h:i:s");                   // "2020-07-20 02:35:17"

addMonth() / subMonth()

为 datetime 对象添加或减去月份。

注意:这些方法的行为与预期的背景函数添加天数不同。如果当前日期是月份的最后一天(31/30/29/28),而目标月份的天数少于当前月份,则日期将被设置为目标月份的最后一天。

示例:datetime 对象是

2017-01-30 17:00:00

并且您想要添加 1 个月,则结果将是

2017-02-28 17:00:00

use ExtDateTime\DateTime;

// create a datetime object and add 10 months
$datetimeFuture = DateTime::create("2020-07-30 12:35:17")
                  ->addMonth(10)
                  ->format("Y-m-d h:i:s");                   // "2020-08-09 22:35:17"

// create a datetime object and subtracts 10 months
$datetimeFuture = DateTime::create("2020-07-30 12:35:17")
                  ->subMonth(10)
                  ->format("Y-m-d h:i:s");                   // "2020-07-20 02:35:17"

即时设置方法

toEndOfDay()

将时间设置为一天结束(23:59:59)。

use ExtDateTime\DateTime;

// create a datetime object and sets the time to the end of the day
$datetimeFuture = DateTime::create("2020-07-30 12:35:17")
                  ->toEndOfDay(10)
                  ->format("Y-m-d h:i:s");                   // "2020-07-30 23:59:59"

toNoon()

将时间设置为中午(12:00:00)。

use ExtDateTime\DateTime;

// create a datetime object and sets the time to noon
$datetimeFuture = DateTime::create("2020-07-30 12:35:17")
                  ->toNoon(10)
                  ->format("Y-m-d h:i:s");                   // "2020-07-30 12:00:00"

toStartOfDay()

将时间设置为一天的开始(00:00:00)。

use ExtDateTime\DateTime;

// create a datetime object and sets the time the start of the day
$datetimeFuture = DateTime::create("2020-07-30 12:35:17")
                  ->toStartOfDay(10)
                  ->format("Y-m-d h:i:s");                   // "2020-07-30 00:00:00"

toStartOfMonth()

将日期设置为每月的第一天,并将时间设置为一天的开始(00:00:00)。

use ExtDateTime\DateTime;

// create a datetime object and sets the date to the first day of the month
$datetimeFuture = DateTime::create("2020-07-30 12:35:17")
                  ->toStartOfMonth()
                  ->format("Y-m-d h:i:s");                   // "2020-07-01 00:00:00"

toEndOfMonth()

将日期设置为每月的最后一天,并将时间设置为一天的结束(23:59:59)。

use ExtDateTime\DateTime;

// create a datetime object and sets the date to the last day of the month
$datetimeFuture = DateTime::create("2020-07-30 12:35:17")
                  ->toEndOfMonth()
                  ->format("Y-m-d h:i:s");                   // "2020-07-31 23:59:59"