2016-07-07 52 views
5

Penso di essere pienamente consapevole della ISO 8601 e che la prima settimana di un anno è la settimana in cui è presente un lunedì. Tuttavia mi sono imbattuto in uno strano comportamento in PHP (5.6) DateTime Class.Settimana mancante in DateTime di PHP-> modifica ('prossima settimana')

Ecco il mio codice:

$start = new DateTime('2009-01-01 00:00'); 
$end = new DateTime(); 
$point = $start; 

while($point <= $end){ 
    echo $point->format('YW'); 
    $point = $point->modify('next week'); 
} 

Questo mette fuori correttamente

200901 
200902 
200903 
... 

Ma se prendo come una data di inizio qualcosa prima nel 2008 come $start = new DateTime('2008-01-01 00:00'); tanto sono un risultato diverso:

... 
200852 
200801 // <=== 2008?? 
200902 
200903 
... 

Si tratta di un bug PHP o mi manca qualcosa qui?

+0

proprio perché la prima settimana del 2009, prova 'echo $ punto-> formato ('YW')." -> ". $ punto-> formato ('Y-m-d'); 'spero che capirai la cosa –

risposta

4

armeggiato con questo e finalmente capito

$start = new DateTime('2008-12-29 00:00'); 
$end = new DateTime('2009-01-7 00:00'); 
$point = $start; 

while($point <= $end){ 
    echo $point->format('YW') . "\t"; 
    echo $point->format('m-d-Y') . "\n"; 
    $point = $point->modify('next week'); 
} 

Quindi la prima data qui è 2008-12-29. Quindi Y è corretto. Ma 2008-12-29 è anche settimana 1. Così il W è anche corretto

https://3v4l.org/JZtqa

+0

Quindi questo è un bug PHP. Se si scorre un anno dopo settimane, ci si aspetterebbe che calcolasse correttamente la 53a settimana, giusto? –

+2

@StevenM Non è un bug. In realtà è così che ISO8601 lo vede. [Dai un'occhiata a questo articolo di Wikipedia] (https://en.wikipedia.org/wiki/ISO_week_date) e noterai che "Lun 29 Dic 2008" è "2009-W01-1" – Machavity

+0

Sì, esattamente - ma PHP rende che la prima settimana di * 2008 * non del 2009 .... –

0

Non è un bug! Ispirato da @Machavity e sulla base di questo this similar question ho trovato una soluzione:

echo $point->format('oW'); 

invece di

echo $point->format('YW') 

produce:

... 
200852 
200901 
200902 
... 

non importa quando la data di inizio è. E 'davvero un caso RTM, come afferma il manuale di PHP:

o ==> ISO-8601 numero dell'anno. Questo ha lo stesso valore di Y, tranne per il fatto che se il numero della settimana ISO (W) appartiene all'anno precedente o successivo, quello stesso anno è il utilizzato. (aggiunto in PHP 5.1.0)

Problemi correlati