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!