meysampg/intldate

该软件包已被废弃,不再维护。作者建议使用 mahdyar/intldate 软件包。

一个小型PHP库,用于在多个日历之间转换日期

v1.2.4 2021-07-17 12:35 UTC

This package is auto-updated.

Last update: 2021-07-17 12:36:02 UTC


README

🟥⚠️ 此软件包已被废弃。请使用 https://github.com/mahdyar/intldate 或自行分支并维护它 ⚠️🟥

StyleCI Build Status Total Downloads Latest Stable Version Maintainability Test Coverage FOSSA Status

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 结束。因此,与输入日期相关的所有方法(设置器和获取器)都命名为 setOriginXXXXgetOriginXXXX(其中 XXXX 显示时间的功能,如 timezonelocale),而所有与输出日期对应的方法都视为 setFinalXXXXgetFinalXXXX。可在本文档底部找到可用的方法列表。

转换

首先,我必须指出,输入日期必须以以下形式为数组

[
    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 等。您可以在 此链接 中找到它们的完整列表。最后,日历是您所需的日期系统。此库使用 phpIntl* 系列,因此您可以使用 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() 用于出站日期函数,其中 YyyyZzzz 是日历的名称。对于入站函数,其签名是 fromYyyy($datetimeArray, $locale = 'en_US', $timezone = 'UTC'),对于出站函数是 toZzzz($locale = 'fa', $timezone = 'UTC')。在入站函数中使用 $locale 如果您有非拉丁数字,在出站函数中使用它以显示用拉丁数字转换的日期(根据日历区域,定义了 $locales,例如出站函数中波斯日历的默认位置为 fa)。此外,通过更改 fromYyyyToZzzz 函数中的 $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!

许可

FOSSA Status