Дати два дати (або два місяці) виявити, в який сезон ми знаходимося в PHP

Я хотів би дізнатись, чи є якийсь простий спосіб визначити сезони: весна, літо, осінь або зима. Я повинен генерувати "резюме", і я хотів би, щоб, якщо період роботи приблизно відповідає сезону (не точно, але, наприклад, з помилкою +/- 10 днів), він повертає весну, літо, осінь або зиму.

Люблю:

  • введення: 25/06/2010, 30/09/2010
  • випуск: літо 2010 року

(У Іспанії літо - з 21 липня по 20 вересня)

  • введення: 02.02.2009, 30.04.2010
  • вихід: 2009-2010

Будь-яка ідея, як це зробити?

1
@fredley він повернеться навесні, влітку, autum або взимку тільки в тому випадку, якщо він перебуває в межах одного періоду, в інших датах без релевантності він повернеться, якщо період менше 1 року: місяць РІК - місяць РОК, протягом періодів понад 1 рік : РІК - РІК. але це остання річ, мабуть, я міг це зробити сам. Дякую
додано Автор udexter, джерело
@fredley одне питання про SO, чому ти не перший редагування мого спасибі? це не відповідає питанням? Дякую
додано Автор udexter, джерело
Що буде поведінка, якщо було введено два дати, такі як 01/01/2010 , 01/01/2012 ?
додано Автор fredley, джерело
Ні, це не є. Це шум.
додано Автор fredley, джерело

3 Відповіді

Looks like this guy got that function written already : http://biostall.com/get-the-current-season-using-php

Навіть підтримує півсфери!

Але це має зробити фокус:

<?php
    function getSeason($date) {
        $season_names = array('Winter', 'Spring', 'Summer', 'Fall');  
        if (strtotime($date) < strtotime($date_year.'-03-21') || strtotime($date) >= strtotime($date_year.'-12-21')) {  
            return $season_names[0];//Must be in Winter
        } elseif (strtotime($date) >= strtotime($date_year.'-09-23')) {  
            return $season_names[3];//Must be in Fall  
        } elseif (strtotime($date) >= strtotime($date_year.'-06-21')) {  
            return $season_names[2];//Must be in Summer  
        } elseif (strtotime($date) >= strtotime($date_year.'-03-21')) {  
            return $season_names[1];//Must be in Spring  
        }  
    }
2
додано

Оскільки ви шукаєте сезон протягом певного періоду, я швидко написав цю функцію, це може бути поліпшеною, і, можливо, є деякі помилки, але десь для початку.

function season($period) 
{
    $seasons    = array(
        'spring'    => array('March 21'     , 'June 20'),
        'summer'    => array('June 21'      , 'September 22'),
        'fall'      => array('September 23' , 'December 20'),
        'winter'    => array('December 21'  , 'March 20')
    );

    $seasonsYear = array();

    $start      = strtotime($period[0]);
    $end        = strtotime($period[1]);

    $seasonsYear[date('Y', $start)] = array();

    if (key(current($seasonsYear)) != date('Y', $end))
        $seasonsYear[date('Y', $end)] = array();

    foreach ($seasonsYear as $year => &$seasonYear)
        foreach ($seasons as $season => $period)
            $seasonYear[$season] = array(strtotime($period[0].' '.$year), strtotime($period[1].' '.($season != 'winter' ? $year : ($year+1))));

    foreach ($seasonsYear as $year => &$seasons) {
        foreach ($seasons as $season => &$period) {
            if ($start >= $period[0] && $end <= $period[1])
                return ucFirst($season).' '.$year;

            if ($start >= $period[0] && $start <= $period[1]) {
                if (date('Y', $end) != $year) 
                    $seasons = $seasonsYear[date('Y', $end)];   
                    $year = date('Y', $end);

                $nextSeason = key($seasons);
                $nextPeriod = current($seasons);                
                do {                    
                    $findNext   = ($end >= $nextPeriod[0] && $end <= $nextPeriod[1]);

                    $nextSeason = key($seasons);
                    $nextPeriod = current($seasons);
                } while ($findNext = False);

                $diffCurr   = $period[1]-$start;
                $diffNext   = $end-$nextPeriod[0];

                if ($diffCurr > $diffNext)
                    return ucFirst($season).' '.$year;
                else {
                    return ucFirst($nextSeason).' '.$year;
                }
            }
        }
    }
}

echo season(array('07/20/2010', '08/20/2010'));
echo "\n";
echo season(array('06/25/2010', '09/30/2010'));
echo "\n";
echo season(array('08/25/2010', '11/30/2010'));
echo "\n";
echo season(array('12/21/2010', '01/01/2011'));
echo "\n";
echo season(array('12/21/2010', '03/25/2011'));

Результат:

/*
Summer 2010
Summer 2010
Fall 2010
Winter 2010
Winter 2011
*/

І крім того, що ви хочете для "сезонного переповнення року":

if (date('Y', $end) != $year) 
    return $year.'-'.date('Y', $end);

Замість:

if (date('Y', $end) != $year) 
    $seasons = $seasonsYear[date('Y', $end)];   
    $year = date('Y', $end);

Примітка. Настає зима.

2
додано

Ось короткий огляд того, що вам потрібно зробити:

  • Розробіть, коли будуть границі вашого сезону. Це велика робота великої , якщо ви збираєтеся зробити це для міжнародного застосування!

  • Коли представлений діапазон дат, спочатку точно визначте, скільки днів цього діапазону відбувається в кожному сезоні.

Ви хочете вивести, як:

 Range | Days | complete?
  Su10 |  12  |     0
   A10 |  90  |     1
   W10 |  02  |     0
  • Після цього вам потрібно буде визначити, чи протягом 10 днів один сезон "завершений", який повинен бути 1 , якщо протягом усього сезону він працює. Якщо це так, виберіть цей сезон. Якщо більше, повні або ні, поверніть false .
1
додано
Ukrainian PHP comunity
Ukrainian PHP comunity
885 учасників

dev-ua/php