php problem IntlDateFormatter shamsi to miladi

a6b3iqyw  于 2023-10-15  发布在  PHP
关注(0)|答案(1)|浏览(105)

我想将太阳历转换为格里历
我用IntlDateFormatter写了这段代码
但不是工作

function shamsi_to_miladi($date)
{
    $now = new DateTime($date);
    $IntlDateFormatter = new IntlDateFormatter(
        'en_US@calendar=gregorian',
        IntlDateFormatter::NONE, 
        IntlDateFormatter::NONE,
        NULL,
        IntlDateFormatter::TRADITIONAL,
        "Y/MM/dd"
    );
    return $IntlDateFormatter->format($now);
}
echo shamsi_to_miladi("1402/08/17");

尝试真正的工作,但不是工作
产出
但真的2023/10/11

yruzcnhs

yruzcnhs1#

你现在有几个问题。首先,你不需要使用DateTime对象,因为它将假定格里高利无保留。由于输入是一个阳历日期,因此您希望使用波斯阳历将其传递给解析函数。这将返回一个unix纪元整数,这是日历不可知的。然后将格式化程序的日历转换为Gregorian,以便输出正确的格式。
您还使用Y作为“一年中的星期”,这是一种不同的日历计算方法。最好坚持使用yyyy标准年格式进行解析,因为前者会从日期中删除很多年。
正如我的侧记,我不是所有的太阳历熟悉,但你提供的输出日期(2023/10/11)似乎是不正确的。我将太阳日1402/07/09传递到多个在线转换器中,答案总是2023/11/08,这就是下面的函数产生的结果:

function shamsi_to_miladi($date)
{
    $IntlDateFormatter = new IntlDateFormatter(
        'en_US@calendar=persian',
        IntlDateFormatter::NONE, 
        IntlDateFormatter::NONE,
        NULL,
        IntlDateFormatter::TRADITIONAL,
        "yyyy/MM/dd"
    );
    $shamsiTimestamp = $IntlDateFormatter->parse($date);
    // Convert from Persian calendar to Gregorian:
    $IntlDateFormatter->setCalendar(IntlDateFormatter::GREGORIAN);
    return $IntlDateFormatter->format($shamsiTimestamp);
}
echo shamsi_to_miladi("1402/08/17"); // 2023/11/08

相关问题