PHP converte um ano de 2 dígitos para um ano de 4 dígitos

Eu tenho dados provenientes do database em um formato de ano de 2 dígitos 13 Estou procurando converter isso para 2013 Eu tentei o seguinte código abaixo …

 $result = '13'; $year = date("Y", strtotime($result)); 

Mas retornou 1969

Como posso consertar isso?

 $dt = DateTime::createFromFormat('y', '13'); echo $dt->format('Y'); // output: 2013 

69 resultará em 2069 . 70 resultará em 1970 . Se você está certo com essa regra, então deixe como está, caso contrário, prepend seus próprios dados do século de acordo com sua própria regra.

Uma informação importante que você não incluiu é: como você acha que um ano de 2 dígitos deve ser convertido em um ano de 4 dígitos?

Por exemplo, acho que acredita que 01/01/13 é em 2013. E quanto ao 01/01/23? Isso é 2023? Ou 1923? Ou até 1623?

A maioria das implementações escolherá um período de 100 anos e assumirá que os 2 dígitos se referem a um ano dentro desse período.

Exemplo mais simples: o ano está no intervalo 2000-2099.

 // $shortyear is guaranteed to be in range 00-99 $year = 2000 + $shortyear; 

E se queremos um alcance diferente?

 $baseyear = 1963; // range is 1963-2062 // this is, of course, years of Doctor Who! $shortyear = 81; $year = 100 + $baseyear + ($shortyear - $baseyear) % 100; 

Experimente. Isso usa a function de módulo (o bit com%) para calcular o deslocamento de seu ano base.

 $result = '13'; $year = '20'.$result; if($year > date('Y')) { $year = $year - 100; } //80 will be changed to 1980 //12 -> 2012 

A questão é com strtotime. Experimente o mesmo com strtotime (“now”).

Basta prepender (adicionar à frente) a string “20” manualmente:

 $result = '13'; $year = "20".$result; echo $year; //returns 2013 

Isso pode ser mais estúpido, mas uma solução rápida seria:

 $result = '13'; $result = '1/1/20' . $result; $year = date("Y", strtotime($result)); // Returns 2013 

Ou você pode usar algo como isto:

 date_create_from_format('y', $result); 

Você pode criar um object de data dado um formato com date_create_from_format()

http://www.php.net/manual/en/datetime.createfromformat.php

 $year = date_create_from_format('y', $result); echo $year->format('Y') 

Use a class DateTime , especialmente DateTime::createFromFormat() , para isso:

 $result = '13'; // parsing the year as year in YY format $dt = DateTime::createFromFormat('y', $result); // echo it in YYYY format echo $dt->format('Y'); 

Eu sou apenas um hack novato e eu sei que esse código é bastante longo. Eu tropecei em sua pergunta quando eu estava procurando uma solução para o meu problema. Estou inserindo dados em um formulário HTML (muito preguiçoso para digitar o ano de 4 dígitos) e, em seguida, escrevendo para um database e eu (por razões que eu não vou aborrecê-lo com) quer armazenar a data em um formato de ano de 4 dígitos. Apenas o contrário do seu problema.

O formulário retorna $ data (eu sei que não devo usar essa palavra, mas eu fiz) como 01/01/01. Eu determino o ano atual ($ yn) e compará-lo. Independentemente do ano registrado é se a data deste século se tornará 20XX. Mas se é menos de 100 (este século) como 89, será lançado em 1989. E continuará a funcionar no futuro à medida que o ano mudar. Sempre bom há 100 anos. Espero que isso ajude você.

// quebra $ data em duas strings

 $datebegin = substr($date, 0,6); $dateend = substr($date, 6,2); 

// obtenha os últimos dois dígitos do ano atual

 $yn=date("y"); 

// determine o século

 if ($dateend > $yn && $dateend < 100) { $year2=19; } elseif ($dateend <= $yn) { $year2=20; } 

// traga ambas as cordas de volta para uma

 $date = $datebegin . $year2 . $dateend; 

Eu tive problemas semelhantes importando campos DOB de excel (CSV), com formato de data de estilo n.american antiquado com ano de 2 dígitos. Eu precisava escrever o aayy-mm-dd apropriado para o db. enquanto não perfeito, é o que eu fiz:

 //$col contains the old date stamp with 2 digit year such as 2/10/66 or 5/18/00 $yr = \DateTime::createFromFormat('m/d/y', $col)->format('Y'); if ($yr > date('Y')) $yr = $yr - 100; $md = \DateTime::createFromFormat('m/d/y', $col)->format('m-d'); $col = $yr . "-" . $md; //$col now contains a new date stamp, 1966-2-10, or 2000-5-18 resp. 

Se você tem certeza de que o ano é sempre 20 então a primeira resposta funciona, caso contrário, não há como fazer o que está sendo solicitado. Você não faz ideia se o ano é passado, atual ou futuro século.

Concedido, não há informações suficientes na questão para determinar se essas datas são sempre < = now , mas mesmo assim, você não saberia se 01 era 1901 ou 2001 . Não é possível.