У меня есть текстовый столбец в mysql, и он сохраняет значение даты в формате yyyy-mm-dd. Теперь, на моей странице php, я использую этот код для анализа в значение даты.
date("F j, Y", strtotime($row['value']));
Теперь я просто прочитал, что strtotime () анализирует значения только после 1 января 1970 года. У меня есть много значений даты до этой даты. Есть ли работа? Я не хочу менять свою структуру базы данных.
Из документации для strtotime()
:
strtotime () имеет предел диапазона между Fri, 13 Dec 1901 20:45:54 GMT и Tue, 19 января 2038 03:14:07 GMT; хотя до PHP 5.1.0 этот диапазон был ограничен с 01-01-1970 по 19-01-2038 в некоторых операционных системах (Windows).
Какую версию PHP вы используете? И на какой платформе? Возможно, пришло время для обновления.
Если вы работаете с датами вне диапазона 13 декабря 1901 года по 19 января 2038 года, тогда рассмотрите использование объектов DateTime PHP, которые могут работать с гораздо более широким диапазоном дат.
Процедурный:
$date = date_create($row['value']); if (!$date) { $e = date_get_last_errors(); foreach ($e['errors'] as $error) { echo "$error\n"; } exit(1); } echo date_format($date, "F j, Y");
ООП:
try { $date = new DateTime($row['value']); } catch (Exception $e) { echo $e->getMessage(); exit(1); } echo $date->format("F j, Y");
вы должны использовать столбец daten, а не текстовый.
и date_format()
Функция SQL для форматирования даты в запросе
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("Ymd", 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("Ymd", 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("Ymd", strtotime($string));//do normal strtotime }
$date = DateTime::createFromFormat('d M Y','17 Jan 1900'); echo $date->format('Ym-d');
Я ноб, и у меня были некоторые аналогичные проблемы, связанные с использованием strtotime vs explode. Я наткнулся на эту тему, и мне очень помогли комментарии относительно изменения в лимите даты Марк Бейкер (спасибо!). Поэтому я написал этот код, чтобы играть с концепцией. Возможно, это поможет другим нообам, таким как я.
Просто измените дату в верхней строке PHP и посмотрите, что происходит с датами ниже – очень интересно. Еще раз спасибо!
<?php $dob = "1890-11-11"; ?> <html> <head> <style> .inputdiv { width:200px; margin:100px auto 10px auto; background-color:#CCC2FC; text-align:center; border:1px solid transparent;} .spacer{ width:199px; margin:20px auto 20px auto;} </style> </head> <body> <div class="inputdiv"> <div class="spacer"><?php echo "Raw dob: ".$dob ?></div> <div class="spacer"><?php echo "Strtotime dob: ".date("mdY", strtotime($dob)) ?></div> <div class="spacer"><?php list ($y, $m, $d) = explode('-', $dob); $dob = sprintf("%02d-%02d-%04d", $m, $d, $y); echo "Explode dob: ".$dob ?></div> </div> </body> </html>