meysampg / intldate
一个小型PHP库,用于在多个日历之间转换日期
Requires
- ext-intl: *
README
🟥⚠️ 此软件包已被废弃。请使用 https://github.com/mahdyar/intldate 或自行分支并维护它 ⚠️🟥
PHP库,用于将日期转换为多个日历
安装
安装此扩展的首选方式是通过 composer。
运行
composer require --prefer-dist meysampg/intldate "*"
或添加
"meysampg/intldate": "*"
到您的 composer.json 文件的 require 部分。
您也可以轻松 下载 并使用它。
使用
一旦安装了库,只需在您的 PHP 文件中使用它即可
use meysampg\intldate\IntlDateTrait;
并在您想要的类中使用它
<?php namespace foo\bar; use meysampg\intldate\IntlDateTrait; class Bar { use IntlDateTrait; // Some codes are here! echo $this->fromGregorian([2017, 9, 7, 12, 23, 45])->toPersian('en')->asDateTime(); }
结构
IntlDateTrait 使用简单的逻辑来命名方法:“日期从 origin 开始到 final 结束。因此,与输入日期相关的所有方法(设置器和获取器)都命名为 setOriginXXXX 和 getOriginXXXX(其中 XXXX 显示时间的功能,如 timezone 或 locale),而所有与输出日期对应的方法都视为 setFinalXXXX 和 getFinalXXXX。可在本文档底部找到可用的方法列表。
转换
首先,我必须指出,输入日期必须以以下形式为数组
[
year, // 2016
month, // 2
day, // 23
hour, // 12
minute, // 23
second // 4
]
目前,库 不能 解析字符串作为时间(见待办事项部分),因此,在转换日期之前,您 必须 在可接受的数组上对其进行解析(可以使用 preg_match 或您所知道的任何工具完成)。现在,您可以使用 IntlDateTrait::from($datetimeArray, $locale, $calendar) 简单地导入输入日期,并使用 IntlDateTrait::to($locale, $calendar) 将其转换为另一个系统。我们在本节的第一个部分讨论了 $datetimeArray,这是我们转换的日期的接受格式。 $locale 是语言的区域信息。例如,对于 英语,它是 en,对于 波斯语,它是 fa,对于 西班牙语,它是 es 等。您可以在 此链接 中找到它们的完整列表。最后,日历是您所需的日期系统。此库使用 php 的 Intl* 系列,因此您可以使用 ICU 项目中支持的所有日历。现在这些日历受到支持:
- 波斯历
- 公历
- 日本历
- 佛教历
- 农历
- 印度历
- 伊斯兰历
- 希伯来历
- 科普特历
- 埃塞俄比亚历
最好在代码中使用它们的处理器而不是直接使用名称。这些处理器是:
// Use them in `self::$CAL_CALENDAR, for example `$calendar = self::$CAL_HEBREW`. $CAL_PERSIAN $CAL_JAPANESE $CAL_BUDDHIST $CAL_CHINESE $CAL_INDIAN $CAL_ISLAMIC $CAL_HEBREW $CAL_COPTIC $CAL_ETHIOPIC $CAL_GREGORIAN
简写
在方便地转换日期方面有一些缩写(是的!我自豪地称自己是一个 懒人 :D)。这些缩写格式为 fromYyyy() 用于入站日期函数,toZzzz() 用于出站日期函数,其中 Yyyy 和 Zzzz 是日历的名称。对于入站函数,其签名是 fromYyyy($datetimeArray, $locale = 'en_US', $timezone = 'UTC'),对于出站函数是 toZzzz($locale = 'fa', $timezone = 'UTC')。在入站函数中使用 $locale 如果您有非拉丁数字,在出站函数中使用它以显示用拉丁数字转换的日期(根据日历区域,定义了 $locales,例如出站函数中波斯日历的默认位置为 fa)。此外,通过更改 fromYyyy 和 ToZzzz 函数中的 $timezone,您可以转换一个日期时间。缩写列表如下表所示。
| 入站 | 出站 |
|---|---|
| fromPersian | toPersian |
| fromJapanese | toJapanese |
| fromBuddhist | toBuddhist |
| fromChinese | toChinese |
| fromIndian | toIndian |
| fromIslamic | toIslamic |
| fromHebrew | toHebrew |
| fromCoptic | toCoptic |
| fromEthiopic | toEthiopic |
| fromGregorian | toGregorian |
显示日期
显示转换日期有两个函数。第一个是 asDateTime,最后一个是 asTimestamp。
asDateTime 的签名是 asDateTime($pattern = 'yyyy/MM/dd, HH:mm:ss')。此函数接受 ICU 可接受的格式。您可以在此链接中找到更多信息:[ICU SimpleDateFormat](http://www.icu-project.org/apiref/icu4c/classSimpleDateFormat.html#details)。此外,实现一个解析传统 PHP date 可接受格式的函数也是一个好主意(见待办事项部分)。
asTimestamp 函数返回 Unix 纪元,正整数表示之后的日期时间,负整数表示之前的日期时间。
示例
这里有一些使用 IntlDateTrait 的示例。我认为它们是必要的也是充分的。
$this->fromTimestamp(1504770825)->toPersian('en')->asDateTime(); // '1396/06/16, 07:53:45' $this->fromGregorian([2017, 9, 7, 12, 23, 45])->toPersian('en')->asDateTime(); // '1396/06/16, 07:53:45' $this->fromGregorian([2017, 9, 7, 12, 23, 45])->toPersian()->asDateTime(); // '۱۳۹۶/۰۶/۱۶, ۰۷:۵۳:۴۵' $this->fromGregorian([2017, 9, 7, 12, 23, 45])->toJapanese()->asDateTime(); // '0029/09/07, 07:53:45' $this->fromGregorian([2017, 9, 7, 12, 23, 45])->toIslamic()->asDateTime(); // '١٤٣٨/١٢/١٧, ٠٧:٥٣:٤٥' $this->fromGregorian([2017, 9, 7, 12, 23, 45])->toBuddhist()->asDateTime(); // '2560/09/07, 07:53:45' $this->fromGregorian([2017, 9, 7, 12, 23, 45])->toChinese()->asDateTime(); // '0034/07/17, 07:53:45' $this->fromGregorian([2017, 9, 7, 12, 23, 45])->toIndian()->asDateTime(); // '1939/06/16, 07:53:45' $this->fromGregorian([2017, 9, 7, 12, 23, 45])->toHebrew()->asDateTime(); // 'תשע״ז/י״ב/ט״ז, 07:53:45' $this->fromGregorian([2017, 9, 7, 12, 23, 45])->toCoptic()->asDateTime(); // '1733/13/02, 07:53:45' $this->fromGregorian([2017, 9, 7, 12, 23, 45])->toEthiopic()->asDateTime(); // '2009/13/02, 07:53:45' $this->fromPersian([1396, 6, 16, 12, 23, 45])->toIslamic()->asDateTime(); // '١٤٣٨/١٢/١٧, ٠٧:٥٣:٤٥' $this->fromPersian([1396, 6, 16, 12, 23, 45])->toGregorian()->asDateTime(); // '2017/09/07, 07:53:45' $this->fromPersian([1396, 6, 16, 12, 23, 45])->toGregorian()->setFinalTimeZone('Asia/Tehran')->asDateTime(); // '2017/09/07, 12:23:45' $this->fromPersian([1396, 6, 16, 12, 23, 45])->toGregorian()->setFinalTimeZone('Asia/Tehran')->asDateTime('yyyy'); // '2017' $this->fromGregorian([2017, 9, 7, 12, 23, 45])->asTimestamp(); // '1504770825' $this->fromPersian([1396, 6, 16, 12, 23, 45])->asTimestamp(); // '1504770825'
IntlDateTrait API
有一些方法可以帮助控制转换过程。我在本节中列出它们。我认为它们的名字反映了它们的用途,如果不是,请为它们编写文档 :D。
| 设置器 | 获取器 |
|---|---|
setOriginDate($datetimeArray) |
getFinalDate() |
setFromLocale($locale) |
getFromLocale() |
setFromCalendar($calendar) |
getFromCalendar() |
setToLocale($locale) |
getToLocale() |
setToCalendar($calendar) |
getToCalendar() |
getFromLocaleAndCalendar() |
getToLocaleAndCalendar() |
setOriginTimeZone($timezone) |
getOriginTimeZone() |
setFinalTimeZone($timezone) |
getFinalTimeZone() |
setOriginCalendar($locale) |
getOriginCalendar() |
setFinalCalendar($locale) |
getFinalCalendar() |
setFinalDateType($datetype) |
getFinalDateType() |
setFinalTimeType($timetype) |
getFinalTimeType() |
setFinalCalendarType($calendarType) |
getFinalCalendarType() |
setFinalPattern($pattern) |
getFinalPattern() |
setIntlDateFormatter($locale = "en_US", $datetype = IntlDateFormatter::FULL, $timetype = IntlDateFormatter::FULL, $timezone = 'UTC', $calendar = IntlDateFormatter::GREGORIAN, $pattern = 'yyyy/MM/dd HH:mm:ss') |
getIntlDateFormatter() |
setIntlCalendar($timezone = 'Asia/Tehran', $locale = 'fa_IR@calendar=persian') |
getIntlCalendar() |
待办事项
- 实现
parsePattern($pattern)方法。
/** * Implement a function to parse both ICU patterns and php date * function patterns and return a pattern that is compatible on * ICU format. The php pattern must start with php keyword, for * example `php:Y-F-d, H:i:s` is a php pattern. */
-
实现guessDateTime($timestring)方法。 -
编写测试!
贡献
只需fork此存储库,进行修改或添加,然后发送 pull request!