Search code examples
phpcalendarintl

Converting non-Gregorian dates using IntlDateFormatter


How should I convert a non-Gregorian date to other calender types using IntlDateFormatter. I want convert "1392-01-02" from persian to islamic calender. I tried the following code but it does not convert the calendar:

$formatter = IntlDateFormatter::create('en_US@calendar=persian', IntlDateFormatter::FULL,
    IntlDateFormatter::FULL, 'Asia/Tokyo',IntlDateFormatter::TRADITIONAL,'yy-MM-dd');
$formatter->setCalendar(IntlDateFormatter::GREGORIAN);
echo $formatter->format($formatter->parse("1392-2-31"));

Solution

  • Define the time you're converting as an instance of IntlCalendar and set the date using its set($year,$month,$day) method.

    $time = IntlCalendar::createInstance("Asia/Tokyo", "en_US@calendar=persian");
    $time->set(1392,2,31);
    
    //alternative way to define time using parse
    
    /**
    These constants are used to specify different formats in the constructor for DateType 
    and TimeType.
    
    IntlDateFormatter::NONE (integer)
    Do not include this element
    IntlDateFormatter::FULL (integer)
    Completely specified style (Tuesday, April 12, 1952 AD or 3:30:42pm PST)
    IntlDateFormatter::LONG (integer)
    Long style (January 12, 1952 or 3:30:32pm)
    IntlDateFormatter::MEDIUM (integer)
    Medium style (Jan 12, 1952)
    IntlDateFormatter::SHORT (integer)
    Most abbreviated style, only essential data (12/13/52 or 3:30pm)
    */
    
    $fmt = new IntlDateFormatter(
        'en_US@calendar=persian',
        IntlDateFormatter::SHORT, //date format
        IntlDateFormatter::NONE, //time format
        'Asia/Tokyo',
        IntlDateFormatter::TRADITIONAL
    );
    
    $time = $fmt->parse('3/31/1392 AP');
    
    $formatter = IntlDateFormatter::create("en_US@calendar=islamic",
      IntlDateFormatter::FULL, 
      IntlDateFormatter::FULL,
      'Asia/Tokyo', 
      IntlDateFormatter::TRADITIONAL);
    
    print $formatter->format($time);
    //Friday, Shaʻban 13, 1434 AH at 8:52:23 AM Japan Standard Time