【问题标题】:Trying to match actual date with days试图将实际日期与天数相匹配
【发布时间】:2019-03-15 11:01:40
【问题描述】:

我的任务是为每个月显示正确的日期到正确的日期。我被困住了,我真的很感激以正确的方式提供一些帮助或指示。到目前为止,由于现在是 10 月,我在 10 月的所有日子里都出去了,但我也想将循环中的日子与正确的日期相匹配。我走错路了吗?

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

$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>';
        } 
    }
}

【问题讨论】:

  • xyproblem.info 可能。这样做的原因是什么?
  • 给定时间戳的月份有多少天,您可以通过日期函数的t 格式说明符轻松确定。 (无论如何,将这些数字保存在数组中的“静态”解决方案在2 =&gt; 28 中大约每四年一次是错误的。)如果您想将输出的工作日语言更改为丹麦语(?),请检查stackoverflow.com/questions/6910912/… (或者如果那是另一种语言,请在此基础上添加一些自己的研究。)
  • 你到底想做什么?输入/输出应该是什么?
  • 我正在尝试构建一个日历,以正确的日期显示实际日期。
  • 我敢打赌,有很好的 php 库可以做到这一点。你看过吗?

标签: php arrays datetime


【解决方案1】:

试试这个

echo  cal_days_in_month(CAL_GREGORIAN, 8, 2018)

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

【讨论】:

    【解决方案2】:

    编辑

    为了这个更优雅的答案,我删除了之前的答案:

    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 将返回给定月份的总天数,这意味着我们不必对它们进行硬编码。考虑到闰年的优势,如果一年中的日子发生变化,您无需更改任何内容!这个功能的使用方法见cal_days_in_month

    &lt;?= 等同于 &lt;?php echo,它更易于书写和阅读 - IMO!

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

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

    $curMonth = mb_convert_case($curMonth, MB_CASE_TITLE);
    

    感谢@julp 的回答。
    有关它的作用的解释,请参见mb_convert_case 的文档;但从本质上讲,它只会将第一个字母转换为大写字母,而不管语言环境如何。

    【讨论】:

    • 真的做到了!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-15
    相关资源
    最近更新 更多