Даваць дзве даты (або два месяцы) выявіць у тым, што сезон мы ў PHP

Я хацеў бы ведаць, калі ёсць просты спосаб вызначыць часы года: вясна, лета, восень ці зіма. Я павінен генерыраваць «рэзюмэ», і я хацеў бы, што калі перыяд работы прыкладна адпавядае сезону (не дакладна, але з хібнасцю +/- 10 дзён, напрыклад) яна вяртаецца вясной, летам, восенню ці зімой.

як:

    <Літый> ўвод: 2010/06/25, 2010/09/30
  • Выхад: Лето 2010

(У Іспаніі летам у перыяд з 21 ліпеня па 20 верасня)

    <Літый> ўвод: 2009/02/02, 2010/04/30
  • Выхад: 2009-2010

Любая ідэя, як гэта зрабіць?

1
@fredley ён вернецца вясна, лета, Autum ці ўзімку, толькі калі ўнутры аднаго перыяду, у іншыя дні, якія не маюць адносін ён вернецца, калі тэрмін менш як 1 год: месяц года - месяц года, за перыяд больш за 1 год : ГОД - ГОД. але гэта апошняе, што я, магчыма, мог бы зрабіць гэта сам. Дзякуй
дададзена аўтар udexter, крыніца
@fredley адно пытанне аб SO, чаму вы не першым рэдагавання дзякуй? яна не падыходзіць на пытанні? дзякуй
дададзена аўтар udexter, крыніца
Што б паводзіны, калі, 2012/01/01 былі ўведзены дзве даты, такія як 2010/01/01 ?
дададзена аўтар 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
дададзена

Вось прыблізны агляд таго, што вам трэба зрабіць:

  • <р> Праца, калі Ваш сезон boundarys будзе. Гэта вялікі, вялікі Праца, калі вы збіраецеся зрабіць гэта для міжнароднага маштабу!

  • Калі прадстаўлены дыяпазон дат, першыя працы дакладна, колькі дзён гэтага дыяпазону ў кожным сезоне.

Вы хочаце выхад, як:

 Range | Days | complete?
  Su10 |  12  |     0
   A10 |  90  |     1
   W10 |  02  |     0
  • Пасля таго, як гэта будзе зроблена, вы павінны будзеце вызначыць, калі адзін сезон «поўны», які павінен быць 1 калі ўвесь сезон працаваў на працягу 10 дзён. Калі абраць гэты сезон. Калі больш поўныя, ці нічога, вярнуць False .
1
дададзена