2010-05-20 4 views
9

У меня есть текстовый столбец в mysql и он сохраняет значение даты в формате yyyy-mm-dd. Теперь, на моей странице php, я использую этот код для анализа в значение даты.Использование strtotime для дат до 1970

date("F j, Y", strtotime($row['value'])); 

Теперь, я только что прочитал, что StrToTime() разбирает значения только после 1 января 1970 года у меня есть много значений даты до этой даты. Есть ли работа? Я не хочу менять свою структуру базы данных.

ответ

1

вы должны использовать столбец date, а не текст один.
и date_format() SQL функция на сегодняшний день формат в запросе

+0

Я не могу изменить тип столбца. У меня есть несколько значений в текстовом столбце, а некоторые из них - даты (в формате yyyy-mm-dd). Существует также другой столбец, который указывает, содержит ли строка значение даты или текстовое значение. – Ctroy

+1

В этом случае вам необходимо переконфигурировать вашу базу данных. – Jacco

+0

Вы говорите, что нет никакой проблемы с этой проблемой, не переделывая базу данных? Я просто хочу преобразовать текст формата yyyy-mm-dd в формат даты F j, Y. Например: 1820-05-20 по 20 мая 1820 года. – Ctroy

13

Из documentation for strtotime():

StrToTime() имеет предел диапазона между Fri, 13 Dec 1901 20:45:54 GMT и Tue, 19 Jan 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"); 

OOP:

try { 
    $date = new DateTime($row['value']); 
} catch (Exception $e) { 
    echo $e->getMessage(); 
    exit(1); 
} 

echo $date->format("F j, Y"); 
+0

Спасибо. Я использую поисковую систему Apache Solr, поэтому использование функции mysql date_format не является опцией, так как все даты должны индексироваться в YYYY-MM-DDTHH-MM -SSZ. Затем он должен быть проанализирован с использованием PHP (я использую PHP api для получения результатов поиска), DateTime - это билет. Редактировать: это может быть ответом для других, сталкивающихся с этой проблемой с Apache Solr: http://wiki.apache.org/solr/DataImportHandler#DateFormatTransformer –

+0

@Mark: У меня php5.2.6, strtotime все еще показывает пробел даты до 1970 года. Где вы видели «до 5.1.0 ...»? –

+0

@ScottChu - метка времени является знаковым целым числом; отрицательные значения используются в течение секунд до 1970-01-01 00:00:00 по Гринвичу и были на всех платформах с 5.1.0. ссылка на это находится в разделе «Примечания» на [docs] (http : //www.php.net/manual/en/function.strtotime.php) стр. (примечание 2) –

1
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 
} 
+1

strtotime возвращает метку времени, ваша функция возвращает дату ISO 8601. Это чрезвычайно важная разница! – Andrew

+0

действительно ты прав. Однако то, что @Ctroy задает, - это способ получить дату ISO 8601, поэтому, я думаю, моя неточность может быть прощена! – Gombo

0

Я нуб, и имеет некоторые аналогичные вопросы, касающиеся использования StrToTime против взрываются. Я наткнулся на эту тему, и мне очень помогли комментарии относительно изменения в лимите даты Марк Бейкер (спасибо!). Поэтому я написал этот код, чтобы играть с концепцией. Возможно, это поможет другим нообам, таким как я.

Просто измените дату на верхней строке 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("m-d-Y", 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> 
1
$date = DateTime::createFromFormat('d M Y','17 Jan 1900'); 
echo $date->format('Y-m-d'); 
Смежные вопросы