neunerlei/tiny-timy

一个针对原生 DateTime 对象的小型扩展(不包含注释的代码约150行)

安装次数: 1,853

依赖项: 1

建议者: 0

安全性: 0

星标: 0

关注者: 1

分支: 0

语言:Shell

1.2.3 2023-12-26 19:57 UTC

This package is auto-updated.

Last update: 2024-09-26 21:36:39 UTC


README

目前有许多非常强大的日期和时间库(如carbonchronos等),在需要执行大量日期相关操作时是有效的。但大部分日常工作中,我只需要日期格式化和正确的时区处理。使用包含数千行代码的大型类来格式化日期时间对象总感觉不太对。

因此,有了 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