尝试将实际日期与天数匹配

时间:2018-10-10 13:51:19

标签: php arrays datetime

我的任务是为每个月的正确日期显示正确的日期。我很困惑,我真的很感谢以正确的方式提供的帮助或指示。到目前为止,由于十月是十月,所以我整天都出去玩,但是我也想将循环中的天数与正确的日期匹配。我走错路了吗?

我要做的就是在每个日期显示同一天。

$months = date("n");
$monthsDays = array (
    1 => 31,
    2 => 28,
    3 => 31,
    4 => 30,
    5 => 31,
    6 => 30,
    7 => 31,
    8 => 31,
    9 => 30,
    10 => 31,
    11 => 30,
    12 => 31
);
$day_of_the_week = array (
    1 => "Måndag",
    2 => "Tisdag",
    3 => "Onsdag",
    4 => "Torsdag",
    5 => "Fredag",
    6 => "Lördag",
    7 => "Söndag"
);
$dayInteger = date('N', time());
echo $day_of_the_week[$dayInteger];
$day_of_the_week = date("D");
$weekNumber = date("W");
$year = date("Y");
foreach($monthsDays as $key=>$value) {
    if($key == $months) {
        echo date("M")."<br>";
        for($i = 1; $i <= $value; $i++) {
           echo '<div class="displayDate">'.$i.'</div>';
        } 
    }
}

2 个答案:

答案 0 :(得分:0)

尝试

echo  cal_days_in_month(CAL_GREGORIAN, 8, 2018)

// 8是月份号
// 2018是年

答案 1 :(得分:0)

编辑

为此,我删除了先前的答案,这是一个更优雅的答案:

setlocale(LC_TIME, array('da_DA.UTF-8','da_DA@euro','da_DA','danish'));
$curYear = strftime('%Y');
?>
<h1><?= $curYear; ?></h1>
<?php
for ($month = 1; $month <= 12; $month++) {
    $curMonth = strftime('%B', strtotime("01-{$month}-{$curYear}"));
    $curMonth = ucfirst($curMonth);
    $curMonth = utf8_encode($curMonth);
    $totalDays = cal_days_in_month(CAL_GREGORIAN, $month, $curYear);
    ?>
    <h2><?= $curMonth; ?></h2>
    <?php for ($day = 1; $day <= $totalDays; $day++) { ?>
        <?php
        $monthName = ucfirst(strftime('%A', strtotime("{$day}-{$month}-{$curYear}")));
        $monthName = ucfirst($monthName);
        $monthName = utf8_encode($monthName);
        ?>
        <div class="displayDate"><?= $day; ?> <?= $monthName; ?></div>
    <?php } ?>
<?php } ?>

说明

这里有很多事情,所以我会泄漏:

setlocale是一种将语言环境设置为指定语言的功能。
第一个参数是要影响的功能,第二个参数是要更改的语言环境。就您而言,这是丹麦语。

strftimedate函数非常相似,不同之处在于它将以语言环境设置的语言返回日期。

在那之后,它实际上只是迭代了几天又几个月。
设置$curMonth时,我使用strtotime,以便可以操纵它以指定的语言提取该日期。最初,我使用DateTime::createFromFormat,但是不尊重通过setlocale设置的语言环境,这就是为什么我使用此 hack 的原因。

$totalDays将返回给定月份的总天数,这意味着我们不必对它们进行硬编码。考虑到leap年的优势,并且如果一年中的日子发生变化,您无需进行任何更改!有关如何使用此功能的信息,请参见cal_days_in_month

<?=等效于<?php echo,这更加容易编写和阅读-IMO!

我使用的其他唯一有趣的东西是utf8_encodeucfirst
前者会将字符串转换为UTF-8,这几乎是当今的标准。后者只会将字符串的第一个字母设置为大写字母。

注意:使用此解决方案设置大写字母可能是一个好主意:

$curMonth = mb_convert_case($curMonth, MB_CASE_TITLE);

感谢@julp的回答。
有关其功能的说明,请参见mb_convert_case的文档;但是从本质上讲,它将仅将首字母转换为大写字母,而不管其语言环境如何。