mindplay / datetime
用于整数时间戳方便操作的可链日期/时间辅助工具
Requires
- php: >=5.3.0
Requires (Dev)
- phpunit/php-code-coverage: 2.*@dev
This package is auto-updated.
Last update: 2024-08-25 19:00:27 UTC
README
这个日期/时间辅助工具旨在通过提供一个可以通过全局函数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
(在此之前,用户空间中有几十个第三方不可变日期/时间对象实现),但你仍然在使用对象。
时间戳是一个值 - 在处理时间戳时,因此我想要一个值类型,而不是对象,因为对象在处理序列化、对象/关系映射等时更复杂。
在处理时区时,我不想将时区附加到时间戳上,因为时间戳和时区实际上没有有意义的关系:时间戳是绝对的,当你将其附加到时区时,这不会改变;唯一不成立的时候是你想要日期/时间作为字符串,但携带时区信息通常更令人困惑,因为它可能不明确地表明使用的是哪个时区 - 这可能会使程序变得混乱且难以阅读。