neunerlei / tiny-timy
一个针对原生 DateTime 对象的小型扩展(不包含注释的代码约150行)
Requires
- php: >=7.3 <8.4
Requires (Dev)
- phpunit/phpunit: ^9.6
README
目前有许多非常强大的日期和时间库(如carbon,chronos等),在需要执行大量日期相关操作时是有效的。但大部分日常工作中,我只需要日期格式化和正确的时区处理。使用包含数千行代码的大型类来格式化日期时间对象总感觉不太对。
因此,有了 tiny DateTimy,它是一个针对原生 DateTime 对象的小型(不包含注释的代码约150行)扩展,因此与它100%兼容。
它提供了常见的格式(sql、javascript、rss等),使用 LOCALE 进行翻译的时间格式,更健壮的构造函数和“自动”时区转换。
安装
使用 composer 安装此包
composer require neunerlei/tiny-timy
用法
您可以使用 DateTimy 类以与 DateTime 对象完全相同的方式工作。
use Neunerlei\TinyTimy\DateTimy; $date = new DateTimy(); $date = new DateTimy("now");
功能
时区转换
时区转换的概念基于这样一个假设,您(大部分情况下)使用两个不同的主要时区。a.) 服务器时区(在我的实际情况中,大部分是 UTC)和 b.) 客户端时区,当您为最终用户渲染时间时。
因此,默认情况下,所有新的 DateTimy 类实例都将设置为“服务器”时区,即 UTC。构造函数中给出的 $time 也假定在“服务器”时区,直到您手动提供另一个时区。
如果您想将时区转换为客户端的需求,可以使用“toClient()”方法。默认情况下,“客户端”时区由 date_default_timezone_get() 定义,直到您手动更改它。
要配置时区,您可以使用静态 configureTimezone() 方法设置两个时区以满足您的需求。
use Neunerlei\TinyTimy\DateTimy; // Set the client timezone DateTimy::configureTimezone("Europe/London"); // Set the server timezone DateTimy::configureTimezone("Europe/Moscow", true); // New created instances ar now per default in the "Europe/Moscow" timezone $i = new DateTimy(); $i->getTimezone()->getName(); // "Europe/Moscow" // Convert it to the client timezone $i->toClientTimezone()->getTimezone()->getName(); // "Europe/London" // And back to the server timezone $i->toServerTimezone()->getTimezone()->getName(); // "Europe/Moscow"
扩展构造函数
DateTimy 类的构造函数已扩展,以比默认构造函数更可靠地处理不同的时间选项。
数值
数值将自动解析为时间戳,因此不需要在前面加上 "@"。
use Neunerlei\TinyTimy\DateTimy; $date = new DateTimy(time() + 400);
克隆/转换 DateTime 对象
您可以将 DateTime() 或 DateTimy() 类的实例作为 $time 传递。构造函数将为您处理转换。
use Neunerlei\TinyTimy\DateTimy; $date = new DateTimy(new DateTimy()); $date = new DateTimy(new DateTime());
字符串中的时区
构造函数现在可以同时处理基于字符串的时区和默认的 DateTimeZone() 对象。
use Neunerlei\TinyTimy\DateTimy; $date = new DateTimy("now", "Europe/Berlin");
使用格式
虽然使用 createFromFormat() 创建基于非标准格式的字符串的新实例仍然是可能的,但现在构造函数也具有从格式读取字符串的能力。
use Neunerlei\TinyTimy\DateTimy; $date = new DateTimy("2020.03.13 00:00", null, "Y.m.d H:i"); // You can use registered formats as well $date = new DateTimy("2020.03.13 00:00", null, DateTimy::FORMAT_TYPE_DATE_AND_TIME);
常见格式
在重复性工作方面,我是一个懒惰的人。PHP 中的日期/时间格式就是这样一项任务。因此,该类为您提供了预配置的格式,以及更改它们或创建全新的格式的选项。默认包含的格式有
- date => Y.m.d
- time => H:i
- dateAndTime => Y.m.d H:i
- sql => Y-m-d H:i:s
- sqlDate => Y-m-d
- js => D M d Y H:i:s O
- rss => D, d M Y H:i:s T
所有格式都可以使用“format”方法或使用支持每个已注册格式的魔法方法应用,例如:formatDateAndTime()
use Neunerlei\TinyTimy\DateTimy; $i = new DateTimy(); $i->format(DateTimy::FORMAT_TYPE_DATE); // or $i->formatDateAndTime(); // or $i->format("dateAndTime");
您可以使用configureFormat()方法添加新的格式或修改预配置的格式。
use Neunerlei\TinyTimy\DateTimy; // Editing an existing format DateTimy::configureFormat(DateTimy::FORMAT_TYPE_DATE, "d.m.Y"); // Add your own format DateTimy::configureFormat("specialFormat", "d-m-Y");
添加您自己的格式后,可以像使用任何预配置的格式一样使用它,例如
use Neunerlei\TinyTimy\DateTimy; // Create from your special format $i = new DateTimy("...", null, "specialFormat"); // Print your special format with $i->formatSpecialFormat(); // or $i->format("specialFormat");
本地化格式化
默认情况下,PHP只有在您使用strftime()方法时才翻译月份或星期的名称。这不支持DateTime对象,需要其自己的特殊语法(每次都忘了那些字符...)。
为此,DateTime类提供了formatLocalized()方法。它根据您的当前LOCALE将F、l、M或D翻译成与strftime()相同的方式,同时保持与format()相同的语法!
use Neunerlei\TinyTimy\DateTimy; // LOCALE de_DE.UTF8 $i = new DateTimy(); $i->formatLocalized("D"); // Montag
运行测试
- 克隆存储库
- 使用
composer install安装依赖项 - 使用
composer test运行测试
特别感谢
特别感谢LABOR.digital(这是德语中的实验室,而不是英语中的“工作”)的团队,使他们能够将我的代码发布到网上。
明信片软件
您可以使用这个包,但如果它进入您的生产环境,我将非常感激您从您家乡寄给我一张明信片,并说明您正在使用我们的哪个包。
您可以在这里找到我的地址。
谢谢 :D