将传统的日本年代转变为格里高利年

时间:2015-01-30 14:45:12

标签: php internationalization

  

传统的日历包括基于的日历   统治皇帝。某些人需要英国日期格式   政府文件和申请。例如,直到2002年1月1日,   日本专利局使用皇帝约会。

more info

我想在日本传统日历和格里高利日历之间进行转换。

使用此处的日期格式:

http://www.icu-project.org/apiref/icu4c/classSimpleDateFormat.html#details

使用Internationalization Functions in PHP

我开发了这个脚本:

/**
 * Convert japanese year (traditional) to gregorian calendar
 * 
 * @author  Gerard Brull <gbblanes@gmail.com>
 * @version 0.1 29/01/2015 (in gregorian calendar :P)
 */

if (version_compare(PHP_VERSION, '5.3.0', '<')) {
    die('we need php 5.3.0 or later');
}

if (!class_exists('IntlDateFormatter')) {
    die('we need php_intl extension.');
}

//----------------------------------------------------------------------
// CONVERT JAPANESE YEAR ERA IN GREGORIAN CALENDAR
//----------------------------------------------------------------------


$cal = IntlCalendar::createInstance(null,'ja_JP@calendar=japanese');

//You can find the era number here: http://demo.icu-project.org/icu-bin/locexp?_=ja_JP&d_=en&calendar=japanese
$cal->set(IntlCalendar::FIELD_ERA, 235); //Heisei (平成)

$cal->set(IntlCalendar::FIELD_YEAR, 27); //year of the era
$cal->clear(IntlCalendar::FIELD_HOUR_OF_DAY);
$cal->clear(IntlCalendar::FIELD_MINUTE);
$cal->clear(IntlCalendar::FIELD_SECOND);
$cal->clear(IntlCalendar::FIELD_MILLISECOND);

echo 'Year in Gregorian calendar ' . $cal->get(IntlCalendar::FIELD_YEAR_WOY) . ' | ' ;
//Result: Year in Gregorian calendar 2015 | 



//----------------------------------------------------------------------
// CONVERT GREGORIAN CALENDAR (NOW) IN JAPANESE YEAR ERA
//----------------------------------------------------------------------

$now = new DateTime();

$formatter = new IntlDateFormatter(
    'ja_JP@calendar=japanese',
    IntlDateFormatter::FULL,
    IntlDateFormatter::FULL,
    'Europe/Madrid',
    IntlDateFormatter::TRADITIONAL,
    'Gy' //Age and year (regarding the age)
);

echo 'Age in Japanese: '. $formatter->format($now);
//Result: Age in Japanese: 平成27

但是,如果你查看我的代码,你可以看到我需要日本皇帝的号码才能使它运作。

我想知道是否可以转换此字符串:

'平成27'

直接进入正确的公历年(2015年)。

我知道我可以通过制作一个字符串数组来做到这一点=&gt; EmperorNumber但我想知道是否有更好的正确方法。

谢谢你的建议。

1 个答案:

答案 0 :(得分:2)

您只需使用IntlDateFormatter::parse

<?php
$formatter = new IntlDateFormatter(
    'ja_JP@calendar=japanese',
    IntlDateFormatter::FULL,
    IntlDateFormatter::FULL,
    'Europe/Madrid',
    IntlDateFormatter::TRADITIONAL,
    'Gy' //Age and year (regarding the age)
);
$r = $formatter->format(strtotime('2012-01-01 Europe/Madrid'));
echo "Age in Japanese: $r\n";
$time = $formatter->parse($r);
$gregCalendar = IntlCalendar::createInstance('Europe/Madrid', 'ja_JP');
$gregCalendar->setTime($time * 1000);
$r2 = IntlDateFormatter::formatObject($gregCalendar, 'Gy');
echo "And back: $r2\n";

给出:

Age in Japanese: 平成24
And back: AD2012