2015-11-07 3 views
1

У меня есть дата, ведьма отформатирована d-m-y как 22-10-49 Я хочу преобразовать ее в объект Date, чтобы сохранить ее в моей базе данных mysql. Я стараюсь:Создать объект даты в PHP для дат до 1970 года в определенном формате

DateTime::createFromFormat('d-m-y', $mydate , new DateTimeZone('GMT')); 

но результат 2049-10-22 вместо 1949-10-22. Я искал и получил, что createFromFormat возвращает дату после 1970 года. Но я не знаю, что делать.

P.s: 22-10-49 это то, что у меня есть, и есть несколько других дат, подобных этому, я не могу изменить его формат или преобразовать его в 22-10-1949 или в любые другие форматы. PS 2: «Я работаю с рождения и excpect 22-10-15 быть 1915, а не 2015.

+0

@Strawberry Я не понял, что вы имеете в виду? –

+0

@Strawberry 2015-10-22. ничего до 1970 года, дата считается находящейся в диапазоне 1970-2069 гг. –

+0

Скажите, что у вас было такое значение, как 22-10-15. Ожидаете ли вы, что это произойдет как 1915 или 2015? Если ответ на этот вопрос будет «Я ожидаю, что это будет 2015 год», то в каком году это отсечение? Это просто, что любое значение, большее, чем «15», относится к году в 20-м веке. – Strawberry

ответ

1

Попробуйте эту функцию

Edit:. Сначала мы преобразуем две цифры года в 4 цифры Тогда мы. сформирует полную дату и передать его функции

$original_date = '22-10-49'; 
    $date_part = explode('-',$original_date); 

    $baseyear = 1900; // range is 1900-2062 
    $shortyear = $date_part[2]; 
    $year = 100 + $baseyear + ($shortyear - $baseyear) % 100; 
    $subdate = substr($original_date, 0, strrpos($original_date, '-')); 
    $string = $subdate."-".$year; 

    echo safe_strtotime($string); 

function safe_strtotime($string) 
{ 
    if(!preg_match("/\d{4}/", $string, $match)) return null; //year must be in YYYY form 
    $year = intval($match[0]);//converting the year to integer 
    if($year >= 1970) return date("Y-m-d", strtotime($string));//the year is after 1970 - no problems even for Windows 
    if(stristr(PHP_OS, "WIN") && !stristr(PHP_OS, "DARWIN")) //OS seems to be Windows, not Unix nor Mac 
    { 
     $diff = 1975 - $year;//calculating the difference between 1975 and the year 
     $new_year = $year + $diff;//year + diff = new_year will be for sure > 1970 
     $new_date = date("Y-m-d", strtotime(str_replace($year, $new_year, $string)));//replacing the year with the new_year, try strtotime, rendering the date 
     return str_replace($new_year, $year, $new_date);//returning the date with the correct year 
    } 
    return date("Y-m-d", strtotime($string));//do normal strtotime 
} 

Выход:. 1949-10-22

Источник: Using strtotime for dates before 1970

+0

Я действительно прочитал эту дату откуда-то еще, и у меня это как «22-10-49», я уверен, что должен быть другой способ. Я не хочу проходить через 'if ... else', чтобы изменить формат своих дат. но спасибо за ваш ответ –

+0

@ShirinAbdolahi, фиксируется формат даты для каждой даты, которую вы получаете? то есть 22-10-49, 22-10-15, 15-07-54 и т. д. – Suyog

+0

да исправлено @suyog –

Смежные вопросы