ScotlandPHP

Formatos de Data

Esta página descreve os diferentes formatos de data que os interpretadores strtotime(), DateTime e date_create() entendem.

Simbolos Utilizados
Descrição Formato Exemplos
daysuf "st" | "nd" | "rd" | "th"  
dd ([0-2]?[0-9] | "3"[01]) daysuf? "7th", "22nd", "31"
DD "0" [0-9] | [1-2][0-9] | "3" [01] "07", "31"
m 'january' | 'february' | 'march' | 'april' | 'may' | 'june' | 'july' | 'august' | 'september' | 'october' | 'november' | 'december' | 'jan' | 'feb' | 'mar' | 'apr' | 'may' | 'jun' | 'jul' | 'aug' | 'sep' | 'sept' | 'oct' | 'nov' | 'dec' | "I" | "II" | "III" | "IV" | "V" | "VI" | "VII" | "VIII" | "IX" | "X" | "XI" | "XII"  
M 'jan' | 'feb' | 'mar' | 'apr' | 'may' | 'jun' | 'jul' | 'aug' | 'sep' | 'sept' | 'oct' | 'nov' | 'dec'  
mm "0"? [0-9] | "1"[0-2] "0", "04", "7", "12"
MM "0" [0-9] | "1"[0-2] "00", "04", "07", "12"
y [0-9]{1,4} "00", "78", "08", "8", "2008"
yy [0-9]{2} "00", "08", "78"
YY [0-9]{4} "2000", "2008", "1978"
Notações Localizadas
Descrição Formato Exemplos
Dia e mês americano mm "/" dd "5/12", "10/27"
Dia, mês e ano americano mm "/" dd "/" y "12/22/78", "1/17/2006", "1/17/6"
Ano com quatro dígitos, mês e dia com barras YY "/" mm "/" dd "2008/6/30", "1978/12/22"
Ano com quatro dígitos e mês (GNU) YY "-" mm "2008-6", "2008-06", "1978-12"
Ano, mês e dia com traços y "-" mm "-" dd "2008-6-30", "78-12-22", "8-6-21"
Dia, mês e ano, com quatro dígitos, com pontos, tabulações ou traços dd [.\t-] mm [.-] YY "30-6-2008", "22.12.1978"
Dia, mês e ano, com dois dígitos, com pontos ou tabulações dd [.\t] mm "." yy "30.6.08", "22\t12.78"
Dia, mês textual e ano dd ([ \t.-])* m ([ \t.-])* y "30-June 2008", "22DEC78", "14 III 1879"
Mês textual e ano com quatro dígitos (O dia é redefinido para 1) m ([ \t.-])* YY "June 2008", "DEC1978", "March 1879"
Ano com quatro dígitos e mês textual (O dia é redefinido para 1) YY ([ \t.-])* m "2008 June", "1978-XII", "1879.MArCH"
Mês textual, dia e ano m ([ .\t-])* dd [,.stndrh\t ]+ y "July 1st, 2008", "April 17, 1790", "May.9,78"
Mês textual e dia m ([ .\t-])* dd [,.stndrh\t ]* "July 1st,", "Apr 17", "May.9"
Dia e mês textual d ([ .\t-])* m "1 July", "17 Apr", "9.May"
Mês abreviado, dia e ano M "-" DD "-" y "May-09-78", "Apr-17-1790"
Ano, mês abreviado e dia y "-" M "-" DD "78-Dec-22", "1814-MAY-17"
Ano (somente o ano) YY "1978", "2008"
Mês textual (somente o mês) m "March", "jun", "DEC"
Notação ISO8601
Descrição Formato Exemplos
Ano com oito dígitos, mês e dia YY MM DD "15810726", "19780417", "18140517"
Ano com quatro dígitos, mês e dia com barras YY "/" MM "/" DD "2008/06/30", "1978/12/22"
Ano com dois dígitos, mês e dia com traços yy "-" MM "-" DD "08-06-30", "78-12-22"
Ano com quatro dígitos, com sinal opcional, mês e dia [+-]? YY "-" MM "-" DD "-0002-07-26", "+1978-04-17", "1814-05-17"

Nota:

Para os formatos y e yy, anos abaixo de 100 são manipulados de maneira especial quando os símbolos y ou yy são utilizados. Se o ano cair no período de 0 (incluso) a 69 (incluso), 2000 anos são adicionados. Se o ano cair no período de 70 (incluso) a 99 (incluso), então 1900 são adicionados. Isso significa que "00-01-01" será interpretado como "2000-01-01".

Nota:

O formato "Dia, mês e ano com dois dígitos, com pontos ou tabulações" (dd [.\t] mm "." yy) somente funciona para valores de ano que variam 61 (incluso) até 99 (incluso) - fora destes anos, o formato de tempo "HH [.:] MM [.:] SS" possui precedência.

Nota:

O formato "Ano (somente o ano)", somente funcionará se uma string de tempo já foi encontrada -- caso contrário o formato será reconhecida como HH MM.

Nota:

É possível exceder positivamente e negativamente os formatos dd e DD. Dia 0 corresponde a último dia do mês anterior, assim como excedências positivas contam no próximo mês. Isso faz com que "2008-08-00" seja equivalente a "2008-07-31" e "2008-07-31" seja equivalente a "2008-07-01" (Junho possui somente 30 dias).

É possível exceder negativamente os formatos mm and MM com o valor 0. O valor de mês 0 corresponde a Dezembro do mês anterior. Como exemplo, "2008-00-22" é equivalente a "2007-12-22".

Se você combinar os dois fatos e exceder negativamente o dia e o mês, o que segue acontece: "2008-00-00" primeiro será convertido para "2007-12-00" que então será convertido para "2007-11-30". Isso também acontece com a string "0000-00-00", que é transformada em "-0001-11-30" (o ano -1 ano calendário ISO 8601, que é 2 anos DC no calendário que antecede o calendário Gregoriano).

add a note add a note

User Contributed Notes 4 notes

up
1
joel dot r dot geurts at gmail dot com
3 months ago
When a javascript date object is saved to a database directly, a string with the following format is saved:

Thu Jan 01 1970 07:00:00 GMT-0500 (Eastern Standard Time)

I read through this article and didn't see any matches for an allowed pattern, so I thought it couldn't work. Then I was encouraged by a coworker to just try dropping the time zone in parenthesis '(Eastern Standard Time)' and lo and behold it worked.

TLDR: dropping the second time zone from a string from a javascript date object saved into a DB, will allow it to be properly parsed.
up
13
Mirek
2 years ago
Note: the day (dd or DD) is first checked for range 0..31 and only if it fits, the overflow and underflow mechanism may apply. If not, strtotime() simply returns false.
If you need unlimited over/underflow for date calculations (for example 2015-01-40 to 2015-02-09), use mktime() instead.
up
-17
matt at azoundria dot com
1 year ago
It's important to note that strtotime does NOT successfully handle any date/time format with the word 'at' in it. (Commonly used.) ie:

September 15th at 6:12 PM

It also does not handle any date/time format with brackets (also reasonably common).

September 15th (6:12:14 PM)

To get around this, and create a more universally compatible strtotime, create your own custom strtotime which first filters these out with a str_replace.

function fullstrtotime ($time) {
  return strtotime(str_replace(array(" at", "(", ")"), "", $time));
}
up
-56
Anonymous
2 years ago
Note: the day (dd or DD) is first checked for range 0..31 and only if it fits, the overflow and underflow mechanism may apply. If not, strtotime() simply returns false.
If you need unlimited over/underflow for date calculations (for example 2015-01-40 to 2015-02-09), use mktime() instead.
To Top