Ottieni il primo giorno della settimana in PHP?


124

Dato un MM-dd-yyyyformato di data , qualcuno può aiutarmi a ottenere il primo giorno della settimana?


4
Cosa intendi per primo giorno della settimana? Intendi Sun, Mon? O intendi la data del primo giorno della settimana?
Jeffrey Hines

2
Il primo giorno della settimana è costante: è lunedì (o forse domenica). Vuoi dire che vuoi ottenere la data del lunedì che precede una data data arbitraria?
Jon Cram

Quale versione di PHP - 4 o 5?
Jon Cram

la data della domenica della settimana. php 5
Iggy Ma

Strano, chiede una DateTimesoluzione e la maggior parte delle risposte non la fornisce. =)
lin

Risposte:


143

Ecco cosa sto usando ...

$day = date('w');
$week_start = date('m-d-Y', strtotime('-'.$day.' days'));
$week_end = date('m-d-Y', strtotime('+'.(6-$day).' days'));

$ day contiene un numero da 0 a 6 che rappresenta il giorno della settimana (domenica = 0, lunedì = 1, ecc.).
$ week_start contiene la data della domenica della settimana corrente come mm-gg-aaaa.
$ week_end contiene la data del sabato della settimana corrente come mm-gg-aaaa.


1
ma significa l'inizio e la fine di "questa settimana", giusto?
Oki Erie Rinaldi

cosa succede se viene fornito il numero della settimana? e voglio che restituisca l'inizio e la data di fine di quella settimana.
Oki Erie Rinaldi

1
@OkiErieRinaldi Probabilmente dovresti aprire una nuova domanda per ricevere la giusta attenzione.
JadedCore

Non preoccuparti, ho capito @JadedCore!
Oki Erie Rinaldi

Non sono sicuro del motivo per cui l'altro è più alto. Non funziona, ma questo funziona! 3v4l.org/q6kKY
Jason

67
strtotime('this week', time());

Sostituisci ora (). I metodi della prossima domenica / ultimo lunedì non funzioneranno quando il giorno corrente è domenica / lunedì.


55
$monday = strtotime('last monday', strtotime('tomorrow'));
Lewis Buckley

this weeknon funziona se devi avere sempre un inizio settimana precedente, ma il commento di @ LewisBuckley lo fa.
Smar

Il secondo argomento time()è facoltativo se si desidera specificare oggi.
Se non il

non ha funzionato per me, ho dovuto impostare una sintassi leggermente diversa per YTD, MTD, WTD.
Ron

6
Questa risposta produce risultati incoerenti, a seconda della versione PHP utilizzata: 3v4l.org/Z3k4E @ LewisBuckley's solution is consistent for all versions: 3v4l.org/Eeh9c
Chris Baker

62

strtotimeFunzione molto semplice da usare :

echo date("Y-m-d", strtotime('monday this week')), "\n";   

echo date("Y-m-d", strtotime('sunday this week')), "\n";

È leggermente diverso tra le versioni PHP :

Uscita per 5.3.0 - 5.6.6, php7 @ 20140507-20150301, hhvm-3.3.1 - 3.5.1

2015-03-16
2015-03-22

Uscita per 4.3.5 - 5.2.17

2015-03-23
2015-03-22

Uscita per 4.3.0 - 4.3.4

2015-03-30
2015-03-29

Confronto in casi limite

Le descrizioni relative come questa settimana hanno il loro contesto. Quanto segue mostra l'output per questa settimana il lunedì e la domenica quando è un lunedì o una domenica:

$date = '2015-03-16'; // monday
echo date("Y-m-d", strtotime('monday this week', strtotime($date))), "\n";   
echo date("Y-m-d", strtotime('sunday this week', strtotime($date))), "\n";

$date = '2015-03-22'; // sunday
echo date("Y-m-d", strtotime('monday this week', strtotime($date))), "\n";   
echo date("Y-m-d", strtotime('sunday this week', strtotime($date))), "\n";

E poi è un po 'diverso tra le versioni PHP :

Uscita per 5.3.0 - 5.6.6, php7 @ 20140507-20150301, hhvm-3.3.1 - 3.5.1

2015-03-16
2015-03-22
2015-03-23
2015-03-29

Uscita per 4.3.5 - 5.0.5, 5.2.0 - 5.2.17

2015-03-16
2015-03-22
2015-03-23
2015-03-22

Uscita per 5.1.0 - 5.1.6

2015-03-23
2015-03-22
2015-03-23
2015-03-29

Uscita per 4.3.0 - 4.3.4

2015-03-23
2015-03-29
2015-03-30
2015-03-29

perché non funziona per la data 05/06/2016, le date delle prossime settimane.

1
Grazie per questo, ho appena modificato questo codice in modo da poter passare un parametro di data opzionale $ dt = $ custom_date? strtotime ($ custom_date): time (); $ monday = date ("Ymd", strtotime ('monday this week', $ dt)); $ domenica = date ("Ymd", strtotime ('domenica di questa settimana', $ dt));
Ron Michael il

47

Mantienilo semplice:

<?php    
$dateTime = new \DateTime('2020-04-01');
$monday = clone $dateTime->modify(('Sunday' == $dateTime->format('l')) ? 'Monday last week' : 'Monday this week');
$sunday = clone $dateTime->modify('Sunday this week');    
?>

Fonte : manuale PHP

NB: come alcuni utenti hanno commentato il valore $ dateTime verrà modificato.


modifica: errore di battitura o sintassi sconosciuta? da dove viene \? $dateTime = new \DateTime('2012-05-14');
Sliq

2
Sto facendo questo per evitare qualsiasi conflitto con un possibile oggetto caricato automaticamente della tua applicazione. È come un percorso assoluto o un percorso relativo.
job3dot5

9
@Panique - la "sintassi sconosciuta" è la sintassi dello spazio dei nomi di PHP 5.3. La spaziatura dei nomi consente di anteporre a una classe uno spazio dei nomi seguito da una barra rovesciata. Qui lo sta usando senza uno spazio dei nomi per specificare la DateTimeclasse principale , il che significa che il codice funzionerà anche se hai un'altra classe chiamata DateTimenello spazio dei nomi corrente.
Spudley

Il nome del giorno è sempre in inglese?
Marwelln,

1
La parte clonata non funziona correttamente. Dovresti prima clonare, quindi eseguire l'operazione su clone se ne hai bisogno di uno originale.
Farid Movsumov

25
$givenday = date("w", mktime(0, 0, 0, MM, dd, yyyy));

Questo ti dà il giorno della settimana della data stessa dove 0= domenica e 6= sabato. Da lì puoi semplicemente calcolare all'indietro fino al giorno che desideri.


6
Questa risposta restituisce se una data data è domenica o lunedì, ecc. Ma l'interrogante ha chiesto la data della domenica della settimana della data specificata come menzionato nel suo commento alla domanda originale.
Rakib

19

Questa domanda necessita di una buona risposta DateTime : -

function firstDayOfWeek($date)
{
    $day = DateTime::createFromFormat('m-d-Y', $date);
    $day->setISODate((int)$day->format('o'), (int)$day->format('W'), 1);
    return $day->format('m-d-Y');
}

var_dump(firstDayOfWeek('06-13-2013'));

Produzione:-

string '06-10-2013' (length=10)

Questo affronterà i confini degli anni e gli anni bisestili.


18

MODIFICA: il link sottostante non è più in esecuzione sulla versione di PHP dichiarata. Funziona su PHP 5.6 che migliora l'affidabilità di strtotime, ma non è perfetto! I risultati nella tabella sono risultati in tempo reale da PHP 5.6.

Per quello che vale, ecco una ripartizione del comportamento traballante di strtotime quando si determina un quadro di riferimento coerente:

http://gamereplays.org/reference/strtotime.php

Fondamentalmente solo queste stringhe ti daranno in modo affidabile la stessa data, indipendentemente dal giorno della settimana in cui ti trovi quando le chiami:

strtotime("next monday");
strtotime("this sunday");
strtotime("last sunday"); 

L'articolo fornisce anche del codice specifico da utilizzare: $ start_of_week = strtotime ("next monday - 1 week"); // Tornerà il lunedì della settimana corrente a partire dalle 00:00:00 "$ end_of_week = strtotime (" next monday - 1 second "); // Tornerà la domenica della settimana corrente che terminerà alle 23:59:59"
Scott M. Stolz

11

Il codice seguente dovrebbe funzionare con qualsiasi data personalizzata, utilizza solo il formato della data desiderato.

$custom_date = strtotime( date('d-m-Y', strtotime('31-07-2012')) ); 
$week_start = date('d-m-Y', strtotime('this week last monday', $custom_date));
$week_end = date('d-m-Y', strtotime('this week next sunday', $custom_date));
echo '<br>Start: '. $week_start;
echo '<br>End: '. $week_end;

Ho testato il codice con PHP 5.2.17 Risultati:

Start: 30-07-2012
End: 05-08-2012

1
Vale la pena notare che questo restituirà sempre il lunedì precedente, quindi se $ custom_date è un lunedì, restituirà la data di lunedì una settimana prima.
Hill79

2
Non funziona correttamente, oggi è domenica, i risultati sono: Inizio: 09-09-2013 Fine: 22-09-2013
user2019515

10

Supponendo che lunedì sia il primo giorno della settimana, funziona:

echo date("M-d-y", strtotime('last monday', strtotime('next week', time())));

1
"MM-gg-aaaa" non è la stessa cosa di "Ymd", adatta la tua risposta alle specifiche della domanda.
Yevgeniy Afanasyev

1
data ("MM-gg-aaaa") restituisce la data come: NovNov-0202-15151515. Spero che sia: date ("Mdy") che fornisce una data leggibile come: Nov-02-15
shasi kanth

"MM-dd-yyyy" deriva dalla domanda. Se non sei sicuro di cosa significhi, chiedilo in un commento alla domanda. Grazie per aver modificato la tua risposta.
Yevgeniy Afanasyev,

9

Cosa ne pensi di questo?

$first_day_of_week = date('m-d-Y', strtotime('Last Monday', time()));
$last_day_of_week = date('m-d-Y', strtotime('Next Sunday', time()));

8
L'ultimo lunedì di lunedì ti darà il lunedì precedente.
Ikke

8

Questo è ciò che sto usando per ottenere il primo e l'ultimo giorno della settimana da qualsiasi data . In questo caso, il lunedì è il primo giorno della settimana ...

$date = date('Y-m-d') // you can put any date you want
$nbDay = date('N', strtotime($date));
$monday = new DateTime($date);
$sunday = new DateTime($date);
$monday->modify('-'.($nbDay-1).' days');
$sunday->modify('+'.(7-$nbDay).' days');

1
Questa è la vera risposta!
Manuel

1
Funziona come un fascino!
Liga

6

Qui sto considerando la domenica come primo e il sabato come ultimo giorno della settimana.

$m = strtotime('06-08-2012');  
$today =   date('l', $m);  
$custom_date = strtotime( date('d-m-Y', $m) );   
if ($today == 'Sunday') {  
   $week_start = date("d-m-Y", $m);  
} else {  
  $week_start = date('d-m-Y', strtotime('this week last sunday', $custom_date));  
}  

if ($today == 'Saturday') {  
  $week_end = date("d-m-Y", $m);
} else {  
  $week_end = date('d-m-Y', strtotime('this week next saturday', $custom_date));  
}
echo '<br>Start: '. $week_start;  
echo '<br>End: '. $week_end;  

Produzione :

Inizio: 05-08-2012
Fine: 11-08-2012


5

Cosa ne pensi di questo?

$day_of_week = date('N', strtotime($string_date));
$week_first_day = date('Y-m-d', strtotime($string_date . " - " . ($day_of_week - 1) . " days"));
$week_last_day = date('Y-m-d', strtotime($string_date . " + " . (7 - $day_of_week) . " days"));

4

Prova questo:

function week_start_date($wk_num, $yr, $first = 1, $format = 'F d, Y')
{
    $wk_ts  = strtotime('+' . $wk_num . ' weeks', strtotime($yr . '0101'));
    $mon_ts = strtotime('-' . date('w', $wk_ts) + $first . ' days', $wk_ts);
    return date($format, $mon_ts);
}

$sStartDate = week_start_date($week_number, $year);
$sEndDate   = date('F d, Y', strtotime('+6 days', strtotime($sStartDate)));

(da questo thread del forum )


come ottengo il numero della settimana e l'anno in tutto ciò? Ho una stringa data in formato MM-gg-aaaa
Iggy Ma

4

Questa è la soluzione più breve e più leggibile che ho trovato:

    <?php
    $weekstart = strtotime('monday this week');
    $weekstop = strtotime('sunday this week 23:59:59');
    //echo date('d.m.Y H:i:s', $weekstart) .' - '. date('d.m.Y H:i:s', $weekstop);
    ?>

strtotimeè più veloce di new DateTime()->getTimestamp().


Questo è perfetto, guarda la mia correzione per le date australiane / britanniche
zanderwar

4

Basta usare date($format, strtotime($date,' LAST SUNDAY + 1 DAY'));


2

Data la versione PHP precedente alla 5.3, la seguente funzione fornisce un primo giorno della settimana della data specificata (in questo caso - domenica, 2013-02-03):

<?php
  function startOfWeek($aDate){
    $d=strtotime($aDate);
    return strtotime(date('Y-m-d',$d).' - '.date("w",$d).' days');
  }

  echo(date('Y-m-d',startOfWeek("2013-02-07")).'
');
?>

2
$today_day = date('D'); //Or add your own date
$start_of_week = date('Ymd');
$end_of_week = date('Ymd');

if($today_day != "Mon")
    $start_of_week = date('Ymd', strtotime("last monday"));

if($today_day != "Sun")
                    $end_of_week = date('Ymd', strtotime("next sunday"));

2
$monday = date('d-m-Y',strtotime('last monday',strtotime('next monday',strtotime($date))));

Devi prima ottenere il prossimo lunedì, quindi ottenere l '"ultimo lunedì" del prossimo lunedì. Quindi, se la data specificata è lunedì, restituirà la stessa data non la scorsa settimana lunedì.


2

Se vuoi che il lunedì sia l'inizio della tua settimana, fai questo:

$date = '2015-10-12';
$day = date('N', strtotime($date));
$week_start = date('Y-m-d', strtotime('-'.($day-1).' days', strtotime($date)));
$week_end = date('Y-m-d', strtotime('+'.(7-$day).' days', strtotime($date)));

Cosa lo rende preferibile a questa risposta o a questa risposta ? Mi sembra che ci siano più che sufficienti opzioni nelle altre 30 risposte ...
Mogsdad

Grazie. questa è una soluzione semplice e funziona come un fascino.
Oleg Popov

2

Un modo intelligente per farlo è lasciare che PHP gestisca le differenze di fuso orario e l'ora legale (DST). Lascia che ti mostri come farlo.

Questa funzione genererà tutti i giorni dal lunedì al venerdì inclusi (utile per generare giorni feriali lavorativi):

class DateTimeUtilities {
    public static function getPeriodFromMondayUntilFriday($offset = 'now') {
        $now = new \DateTimeImmutable($offset, new \DateTimeZone('UTC'));
        $today = $now->setTime(0, 0, 1);

        $daysFromMonday = $today->format('N') - 1;

        $monday = $today->sub(new \DateInterval(sprintf('P%dD', $daysFromMonday)));
        $saturday = $monday->add(new \DateInterval('P5D'));

        return new \DatePeriod($monday, new \DateInterval('P1D'), $saturday);
    }
}

foreach (DateTimeUtilities::getPeriodFromMondayUntilFriday() as $day) {
    print $day->format('c');
    print PHP_EOL;
}

Questo restituirà i datetimes dal lunedì al venerdì per la settimana corrente. Per fare lo stesso per una data arbitraria, passare una data come parametro a DateTimeUtilities ::getPeriodFromMondayUntilFriday, quindi:

foreach (DateTimeUtilities::getPeriodFromMondayUntilFriday('2017-01-02T15:05:21+00:00') as $day) {
    print $day->format('c');
    print PHP_EOL;
}

//prints 
//2017-01-02T00:00:01+00:00
//2017-01-03T00:00:01+00:00
//2017-01-04T00:00:01+00:00
//2017-01-05T00:00:01+00:00
//2017-01-06T00:00:01+00:00

Interessato solo a lunedì, come ha chiesto l'OP?

$monday = DateTimeUtilities::getPeriodFromMondayUntilFriday('2017-01-02T15:05:21+00:00')->getStartDate()->format('c');
print $monday;
// prints
//2017-01-02T00:00:01+00:00


1
<?php
/* PHP 5.3.0 */

date_default_timezone_set('America/Denver'); //Set apprpriate timezone
$start_date = strtotime('2009-12-15'); //Set start date

//Today's date if $start_date is a Sunday, otherwise date of previous Sunday
$today_or_previous_sunday = mktime(0, 0, 0, date('m', $start_date), date('d', $start_date), date('Y', $start_date)) - ((date("w", $start_date) ==0) ? 0 : (86400 * date("w", $start_date)));

//prints 12-13-2009 (month-day-year)
echo date('m-d-Y', $today_or_previous_sunday);

?>

(Nota: MM, dd e yyyy nella domanda non sono sintassi del formato di data php standard - Non posso essere sicuro di cosa si intende, quindi ho impostato $ start_date con ISO anno-mese-giorno)


1

Un altro modo per farlo ...

$year = '2014';
$month = '02';
$day = '26';

$date = DateTime::createFromFormat('Y-m-d H:i:s', $year . '-' . $month . '-' . $day . '00:00:00');
$day = date('w', $date->getTimestamp());

// 0=Sunday 6=Saturday
if($day!=0){

   $newdate = $date->getTimestamp() - $day * 86400;  //86400 seconds in a day

   // Look for DST change 
   if($old = date('I', $date->getTimestamp()) != $new = date('I', $newdate)){
       if($old == 0){
           $newdate -= 3600;  //3600 seconds in an hour
       } else {
           $newdate += 3600;
       }
   }

   $date->setTimestamp($newdate);
}

echo $date->format('D Y-m-d H:i:s');

1

Il modo più semplice per ottenere il primo giorno (lunedì) della settimana corrente è:

strtotime("next Monday") - 604800;

dove 604800 - è il conteggio dei secondi in 1 settimana (60 * 60 * 24 * 7).

Questo codice viene ricevuto il lunedì successivo e diminuito per 1 settimana. Questo codice funzionerà bene in qualsiasi giorno della settimana. Anche se oggi è lunedì.


1

Ho trovato questo abbastanza frustrante dato che il mio fuso orario è australiano e così via strtotime() odia le date del Regno Unito.

Se il giorno corrente è una domenica, strtotime("monday this week")tornerà il giorno successivo.

Per ovviare a questo:

Attenzione : questo è valido solo per le date australiane / britanniche

$startOfWeek = (date('l') == 'Monday') ? date('d/m/Y 00:00') : date('d/m/Y', strtotime("last monday 00:00"));
$endOfWeek = (date('l') == 'Sunday') ? date('d/m/Y 23:59:59') : date('d/m/Y', strtotime("sunday 23:59:59"));

2
Questo funziona anche per le date USA. L'ho testato con il fuso orario di Newyork.
Jayesh D

Finché domenica non è il tuo primo giorno della settimana (lunedì in Australia / Regno Unito), allora andrà bene.
zanderwar

1

Ecco una riga per il primo giorno della scorsa settimana e l'ultimo giorno della scorsa settimana come DateTimeoggetto.

$firstDay = (new \DateTime())->modify(sprintf('-%d day', date('w') + 7))
                             ->setTime(0, 0, 0);
$lastDay = (new \DateTime())->modify(sprintf('-%d day', date('w') + 1))
                            ->setTime(23, 59, 59);

1
$string_date = '2019-07-31';
echo $day_of_week = date('N', strtotime($string_date));
echo $week_first_day = date('Y-m-d', strtotime($string_date . " - " . ($day_of_week - 1) . " days"));
echo $week_last_day = date('Y-m-d', strtotime($string_date . " + " . (7 - $day_of_week) . " days"));

Utile quando abbiamo lunedì come primo giorno della settimana (lunedì-domenica).
Kamran Mushtaq

0

Mi sono imbattuto in questa domanda alcune volte e ho sempre sorpreso che le funzioni di data non rendessero questo più facile o più chiaro. Ecco la mia soluzione per PHP5 che utilizza la DateTimeclasse:

/**
 * @param DateTime $date A given date
 * @param int $firstDay 0-6, Sun-Sat respectively
 * @return DateTime
 */
function getFirstDayOfWeek(DateTime $date, $firstDay = 0) {
    $offset = 7 - $firstDay;
    $ret = clone $date;
    $ret->modify(-(($date->format('w') + $offset) % 7) . 'days');
    return $ret;
}

Necessario clonare per evitare di alterare la data originale.


0

Che dire:

$date = "2013-03-18"; 
$searchRow = date("d.m.Y", strtotime('last monday',strtotime($date." + 1 day")));
echo "for date " .$date ." we get this monday: " ;echo $searchRow; echo '<br>';

Non è il modo migliore, ma ho provato e se sono in questa settimana ottengo il lunedì corretto, e se sono di lunedì lo riceverò quel lunedì.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.