У меня есть данные, поступающие из базы данных в двухзначном формате года. 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
. Его просто невозможно.