Попытка сопоставить фактическую дату с днями - PullRequest
0 голосов
/ 10 октября 2018

Моя миссия - отображать правильный день и правильную дату для каждого месяца.Я так застрял, я был бы очень признателен за помощь или указатели в правильном направлении.Пока я выбираю все дни октября, так как это октябрь, но я также хочу сопоставить дни в цикле с правильной датой.Я поступаю неправильно?

Все, что мне удается сделать, это отображать один и тот же день на каждой дате.

$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 голосов
/ 10 октября 2018

Редактировать

Я удалил предыдущий ответ ради этого, более элегантного ответа:

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 - это функция, которая устанавливает язык локали в соответствии с указанным.
Первый параметр - это функции, на которые нужно воздействовать, второй параметр -локаль для изменения.В вашем случае это был датский.

strftime очень похож на функцию date, за исключением того, что он возвращает дату на языкеустанавливается языковым стандартом.

После этого на самом деле просто повторяются по дням и месяцам.
При настройке $curMonth я использую strtotime, чтобы я мог манипулировать им для извлеченияэта дата на указанном языке.Первоначально я использовал DateTime::createFromFormat, но это не относится к локали, установленной с помощью setlocale, поэтому я использовал этот hack .

$totalDays возвращает общее количество дней в данном месяце, это означает, что нам не нужно их жестко кодировать.Преимущества заключаются в високосных годах, и если дни года меняются, вам не нужно ничего менять!См. cal_days_in_month, чтобы узнать, как использовать эту функцию.

<?= эквивалентен <?php echo, который намного проще писать и читать - IMO!

Единственными интересными вещами, которые я использовал, являются utf8_encode и ucfirst.
Преобразователь преобразует строку в UTF-8, что в наши дни является почти стандартом.Последний просто установит первую букву строки в заглавную букву.

Примечание : было бы неплохо использовать это решение для установки заглавной буквы:

$curMonth = mb_convert_case($curMonth, MB_CASE_TITLE);

Спасибо @ julp за этот ответ.
Для объяснения того, что он делает, см. Документацию для mb_convert_case;но по сути он просто преобразует первую букву в заглавную, независимо от локали.

0 голосов
/ 10 октября 2018

попробуйте

echo  cal_days_in_month(CAL_GREGORIAN, 8, 2018)

// 8 - номер месяца
// 2018 - год

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...