2010-05-20 3 views
9

나는 mysql에 텍스트 열을 가지고 yyyy-mm-dd 형식으로 날짜 값을 저장합니다. 이제 php 페이지에서이 코드를 사용하여 날짜 값을 파싱합니다.1970 년 이전의 날짜에 strtotime 사용

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

이제 strtotime()은 1970 년 1 월 1 일 이후에만 값을 파싱합니다. 그 날짜 이전에 많은 날짜 값이 있습니다. 해결 방법이 있습니까? 데이터베이스 구조를 변경하고 싶지 않습니다.

답변

1

텍스트가 아닌 date 열을 사용해야합니다. 쿼리 documentation for strtotime()에서

+0

나는 열 유형을 변경할 수 없습니다. 텍스트 열에 여러 값이 있고 그 중 일부는 날짜 (yyyy-mm-dd 형식)입니다. 행에 날짜 값이나 텍스트 값이 포함되어 있는지 여부를 지정하는 또 다른 열이 있습니다. – Ctroy

+1

그런 경우 데이터베이스를 재 설계해야합니다. – Jacco

+0

데이터베이스를 다시 디자인하지 않고이 문제를 해결할 수있는 방법이 없다고 말하고 있습니까? yyyy-mm-dd 형식의 텍스트를 날짜 형식 F j, Y로 변환하고 싶습니다. 예 : 1820-05-20부터 1820 년 5 월 20 일까지 – Ctroy

13

형식으로 날짜에
date_format()는 SQL 기능 :

한 strtotime()는 금의 범위 제한, 1901년 12월 13일 그리니치 표준시 20시 45분 54초 및 1월 19일 (화)이있다 2038 03:14:07 GMT; PHP 5.1.0 이전에는 일부 운영 체제 (Windows)에서이 범위가 01-01-1970에서 19-01-2038 사이로 제한되었습니다.

실행중인 PHP 버전은 무엇입니까? 그리고 어떤 플랫폼에서? 아마도 업그레이드를위한 시간입니다.

1901 년 12 월 13 일부터 2038 년 1 월 19 일 사이의 날짜 범위를 사용하여 작업하는 경우 훨씬 다양한 날짜 범위에서 작동 할 수있는 PHP DateTime 객체를 사용하는 것이 좋습니다. 절차

:

$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 GMT 이전의 초 단위로 사용되었으며 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'); 
관련 문제