PHP intl может преобразовывать дату по григорианскому календарю в другой тип календаря

PHP intl может конвертировать дату по григорианскому календарю в другой тип календаря.

Например, от григорианского до хиджры, от 2017/04/11 до 1396/01/22.

Или мы должны использовать внешнюю библиотеку для преобразования дат?


person msoa    schedule 10.04.2017    source источник
comment
php.net/manual/en/ref.calendar.php   -  person aynber    schedule 10.04.2017


Ответы (3)


Вы можете использовать этот метод:

function getDateTimeFromCalendarToFormat($format = 'yyyy-MM-dd HH:mm:ss',     $time = null, $locale = 'fa_IR', $calendar = 'persian', $timeZone = 'Asia/Tehran')
{
    if (empty($time)) {
        $time = new \DateTime();
    }

    $formatter = new \IntlDateFormatter("{$locale}@calendar={$calendar}", \IntlDateFormatter::FULL, \IntlDateFormatter::FULL, $timeZone, \IntlDateFormatter::TRADITIONAL);
    $dateArray = [];

    $formatter->setPattern($format);

    return $formatter->format($time);
}

если вы вызываете getDateTimeFromCalendarToFormat('yyyy-MM-dd HH:mm:ss',null,'en_US')
Return
1396-06-27 13:50:21

если вы вызываете getDateTimeFromCalendarToFormat('yyyy-MM-dd HH:mm:ss',null,'fa_IR')
Return
۱۳۹۶-۰۶-۲۷ ۱۳:۴۹:۵۱

Новая строка шаблона для использования. Возможные шаблоны описаны в разделе Форматирование даты и времени.

person Honarkhah    schedule 18.09.2017
comment
Почему? @мохаммад-салехи - person Honarkhah; 09.05.2018
comment
извини @honarkah, это была моя ошибка, или, может быть, это ошибка PHP. Я использовал 'Y-m-d H:i:s' для формата $, и каждый раз он возвращал неправильный номер месяца. но он отлично работает с «Y-M-d H: i: s» (заглавная М). в чем разница между yyyy и Y, или i и mm и другими многобуквенными буквами? - person Mohammad Salehi; 09.05.2018
comment
@MohammadSalehi Вы можете проверить userguide.icu-project.org/formatparse/datetime , это является полным примером шаблона, который вы можете использовать. - person Honarkhah; 12.05.2018

Да, оно может. Это пример, который преобразует объект времени в его персидскую форматированную строку, используя intl:

function c2persian($time, $toCalender = 'persian', $timezone = 'Asia/Tehran', $locale = 'fa_IR') {
    $formatter = IntlDateFormatter::create($locale, NULL, NULL, $timezone, IntlCalendar::createInstance($timezone, "$locale@calendar=$toCalender"));
    return $formatter->format($time);
}
$time = strtotime("2089-08-09 00:00:00 UTC");
echo c2persian($time);

Дополнительную информацию можно найти в документации php intlCalendar.

person Mojtaba Rezaeian    schedule 28.12.2018

PHP уже имеет функции формата даты, вам нужно сначала преобразовать с помощью функции strtotime() и получить желаемые значения с помощью date()

<?php
$originalDate = "2017/04/11";

$theDate = strtotime($originalDate);

$theDay = date('d',$theDate);
$theMonth = date('m',$theDate);
$theYear = date('Y',$theDate);

$customFormat = date('Y-m-d',$theDate);
$customFormat2 = date('d/m/Y',$theDate);
$customFormat3 = date('F j, Y, g:i a',$theDate);
?>

Пример работы здесь: https://eval.in/772416

Вы можете получить больше информации о дате в php здесь: http://php.net/manual/en/function.date.php

person TriForce    schedule 10.04.2017
comment
Люди голосуют против, но не дают никакого контекста. ОП спрашивал о том, как полностью преобразовать в другой календарь, а не только о том, как преобразовать формат даты/времени в исходном календаре. Ваш ответ абсолютно правильный, только не на этот вопрос. - person joshtronic; 25.05.2019