Intereting Posts
PHP – импортировать CSV-файл в базу данных mysql. Используя LOAD DATA INFILE Получите ссылки на видео с Youtube Channel, извлеките идентификаторы видео из Urls и сохраните их в массиве php-cgi работает очень медленно на окнах Функция register_shutdown_function не вызвана Изменение размера iframe в соответствии с высотой содержимого в нем. соединение с базой данных codeigniter 3 с третьей базой данных Как предотвратить показ символа символа вопроса, даже используя mb_substr и utf-8 Laravel 4: две разные страницы просмотра для одного URI, основанного на статусе auth PHP одновременных запросов HTTP? форма не отправляет файл изображения в электронную почту Как получить время и дату из штампа даты и времени в php Использование dompdf с абсолютными ссылками Каков наилучший способ добавить две строки вместе? Извлечение данных XML с использованием PHP simpleXML Обновление силовой страницы при перенаправлении

PHP конвертирует 2-значный год в 4-значный год

У меня есть данные, поступающие из базы данных в двухзначном формате года. 13 Я хочу преобразовать это в 2013 Я пробовал следующий код ниже …

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

Но он вернулся в 1969 году

Как я могу это исправить?

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

69 приведет к 2069 . 70 приведет к 1970 . Если вы в порядке с таким правилом, то оставьте как есть, в противном случае добавьте свои собственные данные о веках в соответствии с вашим собственным правилом.

Одна важная часть информации, которую вы не включили, – это: как вы думаете, что двухзначный год должен быть преобразован в 4-значный год?

Например, я предполагаю, что вы считаете, что 01/01/13 в 2013 году. Как насчет 01/01/23? Это 2023? Или 1923? Или даже 1623?

Большинство реализаций выбирают 100-летний период и предполагают, что 2-значные цифры относятся к году в течение этого периода.

Самый простой пример: год находится в диапазоне 2000-2099.

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

Что, если мы хотим другого диапазона?

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

Попробуйте. Для вычисления смещения с базового года используется функция modulo (бит с%).

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

Проблема связана с strtotime. Попробуйте то же самое с strtotime («now»).

Просто добавьте (добавьте спереди) строку «20» вручную:

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

Это может быть глупо, но быстрое исправление:

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

Или вы можете использовать что-то вроде этого:

 date_create_from_format('y', $result); 

Вы можете создать объект даты с учетом формата date_create_from_format()

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

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

Используйте класс DateTime , особенно DateTime::createFromFormat() , для этого:

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

Я просто новичок, и я знаю, что этот код довольно длинный. Я наткнулся на ваш вопрос, когда искал решение моей проблемы. Я ввожу данные в HTML-форму (слишком ленив, чтобы набирать 4-значный год), а затем записывать в БД, а я (по причинам, которые не буду вас беспокоить) хочу сохранить дату в четырехзначном формате года. Только обратная сторона вопроса.

Форма возвращает $ date (я знаю, что я не должен использовать это слово, но я сделал) как 01/01/01. Я определяю текущий год ($ yn) и сравниваю его. Независимо от того, какой год вступил, если дата в этом веке станет 20XX. Но если это меньше 100 (этот век), как 89, это выйдет в 1989 году. И оно будет продолжать работать в будущем по мере изменения года. Всегда хорош в течение 100 лет. Надеюсь, это поможет вам.

// разбить $ date на две строки

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

// получить последние две цифры текущего года

 $yn=date("y"); 

// определение века

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

// возвращаем обе строки обратно в одну

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

У меня были аналогичные проблемы с импортом полей DOB Excel (CSV) с устаревшим форматом даты n.american с 2-значным годом. Мне нужно было написать правильный yyyy-mm-dd в db. хотя и не совершенен, это то, что я сделал:

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

Если вы уверены, что в году всегда 20 то первый ответ будет работать, иначе нет способа сделать то, что задает период . Вы не представляете, прошел ли год, текущий или будущий век.

Конечно, в вопросе недостаточно информации, чтобы определить, всегда ли эти даты <= now , но даже тогда вы не знаете, был ли 01 1901 или 2001 . Его просто невозможно.