PHP-де қандай маусымда екі күнді (немесе екі айды) анықтау

Көктем, жаз, күз немесе қыс мезгілдерін анықтаудың жеңіл әдісі бар ма екенін білгім келеді. Мен «резюме» жасауым керек, және егер жұмыс кезеңі шамамен маусымға сәйкес келсе (мысалы, +/- 10 күндік қателіктермен емес) көктем, жаз, күз немесе қыста қайтарылады.

Ұнайды:

  • енгізу: 25/06/2010, 30/09/2010
  • шығу: Жаз 2010

(Испанияда жазда 21 шілде мен 20 қыркүйек аралығында)

  • енгізу: 02/02/2009, 30/04/2010
  • шығу: 2009-2010

Мұны қалай істеуге болады?

1
@fredley ол көктемгі, жазғы, ауаша немесе қыстың бір кезеңде ғана болған жағдайда ғана қайтарылады, басқа мерзімдерде ешқандай маңызы жоқ, егер мерзімі 1 жылдан аз болса, қайтарылады: Ай YEAR - Ай жыл, 1 жылдан артық кезең үшін : YEAR - YEAR. бірақ бұл соңғы нәрсе, бәлкім, мен мұны өзім мүмкін. Рақмет сізге
қосылды автор 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
қосылды