【问题标题】:Strange problem: PHP returns wrong easter date this year奇怪的问题:PHP 今年返回错误的复活节日期
【发布时间】:2021-05-02 07:00:29
【问题描述】:

我的代码中需要今年的复活节日期。今年的 2021 年复活节将在 4 月 4 日星期日举行。

但是当我运行echo date('Y-m-d',easter_date(2021)); PHP 时返回:

2021-04-03

这怎么可能?怎么了?

【问题讨论】:

标签: php function datetime php-7


【解决方案1】:

取自 PHP 手册:Link

注意: Easter_date() 依赖于系统的 C 库时间函数,而不是使用 PHP 的内部日期和时间函数。因此,easter_date() 使用 TZ 环境变量来确定它应该运行的时区,而不是使用 PHP 的默认时区,这可能会导致在将此函数与 PHP 中的其他日期函数结合使用时出现意外行为。

作为一种解决方法,您可以使用 Easter_days() 与 DateTime 和 DateInterval 来计算您的 PHP 时区中复活节的开始时间,如下所示:

<?php
function get_easter_datetime($year) {
    $base = new DateTime("$year-03-21");
    $days = easter_days($year);

    return $base->add(new DateInterval("P{$days}D"));
}

foreach (range(2015, 2022) as $year) {

    printf("Easter in %d is on %s\n",
           $year,
           get_easter_datetime($year)->format('D F j'));
}

结果

PHP 8.0.1
Easter in 2015 is on Sun April 5
Easter in 2016 is on Sun March 27
Easter in 2017 is on Sun April 16
Easter in 2018 is on Sun April 1
Easter in 2019 is on Sun April 21
Easter in 2020 is on Sun April 12
Easter in 2021 is on Sun April 4
Easter in 2022 is on Sun April 17

【讨论】:

【解决方案2】:

更灵活的方法是使用复活节方法。

echo dt::Easter(2021)->format('l, j F Y');
//Sunday,4 April 2021

//Orthodox Easter 2021
echo dt::Easter(2021,dt::EASTER_EAST)->format('l, j F Y'); 
//Sunday, 2 May 2021

方法 Easter 是 PHP class 的一部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多