2013-06-10 8 views
8

mam danych pochodzących z bazy danych w formacie 2 cyfr roku 13 szukam przekonwertować to do 2013 Próbowałem następujący kod poniżej ...PHP konwertować 2-cyfrowy rok do roku 4-cyfrowy

$result = '13'; 

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

Ale wrócił 1969

Jak mogę to naprawić?

+1

Możesz to naprawić przechowując rok w bazie danych z resztą numeru :) – Smuuf

+3

'$ year = '20' + $ result'. – Matthew

+0

Co, jeśli data miałaby miejsce w 1995 roku? do wyświetlania przyszłych dat, myślę, że to nie zadziała. – Rorschach

Odpowiedz

1

Problem dotyczy polecenia strtotime. Spróbuj tego samego z strtotime ("teraz").

1

Wystarczy prepend (dodaj do przodu) napisu "20" ręcznie:

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

$year = '20'.$result; 

if($year > date('Y')) { 
    $year = $year - 100; 
} 

//80 will be changed to 1980 
//12 -> 2012 
15
$dt = DateTime::createFromFormat('y', '13'); 
echo $dt->format('Y'); // output: 2013 

69 spowoduje 2069. 70 spowoduje 1970. Jeśli nie masz nic przeciwko takiej zasadzie, pozostaw tak, jak jest, w przeciwnym razie, dodaj własne dane z wieków zgodnie z własną regułą.

+0

Niestety, usunąłeś swój komentarz. ale, tak, miałeś rację! thx;) i oczywiście * działało *, ponieważ faktycznie mamy 2013;) miły błąd. hehe – hek2mgl

+0

to żaden błąd. Jest on udokumentowany na php.net w [createfromformat] (http://php.net/manual/en/datetime.createfromformat.php) 'y: Dwucyfrowa reprezentacja roku (która zakłada się, że jest w zakresie 1970- 2069, włącznie) ' – Dwza

1

To może być najgłupsze, ale szybkie ustalenie byłoby:

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

Lub można użyć coś takiego:

date_create_from_format('y', $result); 
1

Użyj klasę DateTime, zwłaszcza DateTime::createFromFormat(), gdyż to:

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

Jedna ważna informacja nie zostały uwzględnione: jak sądzisz rok 2 cyfry powinny być zamienione na 4-cyfrowy rok?

Na przykład przypuszczam, że uważasz, że 01.01.13 jest w 2013 roku. Co z 01/01/23? Czy to jest 2023? Lub 1923? A może nawet 1623?

Większość wdrożeń wybierze 100-letni okres i przyjmie, że 2 cyfry odnoszą się do roku w tym okresie.

Najprostszy przykład: rok mieści się w przedziale 2000-2099.

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

Co jeśli chcemy innego zakresu?

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

Wypróbuj. Wykorzystuje to funkcję modulo (bit z%) do obliczenia przesunięcia z roku bazowego.

+0

Edytowane w celu poprawienia kolejności operandów. Wybacz mi; Napisałem to na moim telefonie! –

0

Jestem tylko hakiem dla początkujących i wiem, że ten kod jest dość długi. Natknąłem się na twoje pytanie, gdy szukałem rozwiązania mojego problemu. Wprowadzam dane do formularza HTML (zbyt leniwe, aby wpisać 4-cyfrowy rok), a następnie zapisywanie do DB i I (z powodów, dla których nie będę was zanudzać), chcę zapisać datę w formacie 4-cyfrowym. Tylko na odwrót od twojego problemu.

Formularz zwraca datę $ (wiem, że nie powinienem używać tego słowa, ale zrobiłem) jako 01/01/01. Ustalam bieżący rok ($ yn) i porównuję go. Bez względu na to, jaki rok upłynie, jeśli data jest w tym stuleciu, stanie się 20XX. Ale jeśli jest mniej niż 100 (w tym stuleciu), jak 89, to wyjdzie 1989. I będzie nadal działać w przyszłości wraz ze zmianą roku. Zawsze dobre przez 100 lat. Mam nadzieję, że to ci pomoże.

// przerwa $ data do dwóch ciągów

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

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

// dostać dwie ostatnie cyfry bieżącego roku

$yn=date("y"); 

// określić Century

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

elseif ($dateend <= $yn) 

{ 
    $year2=20; 
} 

// przynieść zarówno łańcuchy z powrotem do jednego

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

Miałem podobne problemy importowania Excela (CSV) do pól DOB, z przestarzałym formatem daty w stylu n .american z 2-cyfrowym rokiem. Musiałem napisać odpowiedni rrrr-mm-dd do bazy danych. natomiast nie jest doskonały, to jest to, co zrobiłem:

//$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. 
0

Jeżeli jesteś pewien, że rok jest zawsze 20 coś wtedy pierwsze prace odpowiedź, w przeciwnym razie naprawdę nie ma sposobu, aby robić to, co jest proszony okres. Nie masz pojęcia, czy rok upłynął, obecny czy przyszły wiek.

To prawda, nie ma wystarczająco dużo informacji w pytaniu do ustalenia, czy daty te są zawsze <= now, ale nawet wtedy, to nie wiem, czy 01 był 1901 lub 2001. To po prostu niemożliwe.