mindplay/datetime

用于整数时间戳方便操作的可链日期/时间辅助工具

1.1.0 2015-01-13 22:08 UTC

This package is auto-updated.

Last update: 2024-08-25 19:00:27 UTC


README

Build Status

Code Coverage

Scrutinizer Code Quality

这个日期/时间辅助工具旨在通过提供一个可以通过全局函数datetime()访问的可链式辅助工具,使PHP中的日期/时间管理更加方便。

我需要一个方便处理时间戳的方法,它应该提供与例如DateTime相同的便利性(以及IDE支持),但没有问题。

全局的datetime()函数接受一个整数时间戳作为参数,或一个与strtotime()兼容的有效日期/时间字符串,将其应用于辅助工具,并返回它。

$time = datetime('1975-07-07')->time; // parse date/time string to timestamp

$str = datetime(time())->datetime; // timestamp to 'YYYY-MM-DD HH:MM:SS' format

辅助工具有一个配置对象,用于定义全局日期/时间格式和默认时区,默认时区为UTC,无论环境设置如何 - 由于时间戳(与DateTime不同)不携带时区信息,默认时区可以被更改,但你也可以切换到不同的时区以方便字符串输出。

$a = datetime()->utc()->long; // system date/time in long format

$b = datetime()->timezone('EST')->short; // short date/time in EST timezone

辅助工具实现了__toString(),并会使用'default'格式进行格式化,该格式也是可配置的。你可以定义任意数量的格式,或直接指定格式,你可以在链式调用的末尾使用->format()来渲染这些格式。默认格式如'short''long''string''date'也可以直接作为(动态)属性使用。

datetime()->config->formats['weekday'] = 'l';

echo datetime()->timezone('PST')->format('weekday'); // current weekday in PST

基本计算也可以使用简单的英语进行

$today = datetime()->date()->time; // date() resets the time to 00:00:00

$this_month = datetime()->month()->time; // month() resets to start of the month

$next_week = datetime()->add('1 week')->time;

$whenever = datetime()->add('1 month')->sub('3 days 2 hours 1 minute')->time;

注意事项:除非你使用echo输出结果(调用__toString()),否则你的调用链应该始终以属性而不是方法()调用结束 - 辅助类属性永远不会返回辅助对象,总是返回一个值。

$bad = datetime(); // reference to DateTimeHelper !

$wrong = datetime()->timezone('EST')->add('1 week'); // oh noes!

还有其他一些功能,你可以查看单元测试来获取每个可能操作的示例,或者使用IDE中的自动完成功能进行尝试。

为什么不是对象呢?

没有人不喜欢对象,但DateTime有麻烦 - 看看

$today = new DateTime();
$yesterday = $today->modify('-1 day');

echo "today: " . $today->format('Y-m-d') . "\n";
echo "yesterday: " . $yesterday->format('Y-m-d');

如果你理解了DateTime是如何工作的,你可能会为这种无意义的事情做好准备

today: 2013-03-21
yesterday: 2013-03-21

modify()add()sub()这样的方法修改的是DateTime对象,而不是返回一个新的DateTime实例。

当然,你可以在PHP的最新版本中获得DateTimeImmutable(在此之前,用户空间中有几十个第三方不可变日期/时间对象实现),但你仍然在使用对象。

时间戳是一个值 - 在处理时间戳时,因此我想要一个值类型,而不是对象,因为对象在处理序列化、对象/关系映射等时更复杂。

在处理时区时,我不想将时区附加到时间戳上,因为时间戳和时区实际上没有有意义的关系:时间戳是绝对的,当你将其附加到时区时,这不会改变;唯一不成立的时候是你想要日期/时间作为字符串,但携带时区信息通常更令人困惑,因为它可能不明确地表明使用的是哪个时区 - 这可能会使程序变得混乱且难以阅读。