2009-06-27 7 views
2

그래서 사용자가 페이지를 다시로드 할 때마다 업데이트되는 사용자 테이블에 last_active이라는 필드가 있습니다.
유닉스 타임 스탬프에 저장됩니다. Last online: 4 d 18 h 19 m ago일, 시간, 분에 대한 유닉스 타임 스탬프

이 어떻게 그렇게 할 것 :이 같은 출력이 싶습니다

? PHP의 날짜()로 할 수 있습니까?

감사합니다.

답변

3

가장 간단한 방법은 last_active 시간 소인과 현재 시간 소인 time()을 사용하는 것입니다. 그런 다음 현재 시간 소인에서 마지막 활성을 뺀 다음 하루의 시간을 초 단위로 나눈 값을 일 단위로 나눌 수 있습니다. 시간 단위로 시차를 계산할 수 있습니다.

이 방법은 (등 윤년) 특별한 경우 약간 부정확 할 수 있지만 충분합니다 당신의 간단한 유스 케이스

당신이 원한다면 직접 MySQL의에이를 수
+2

유닉스 타임 스탬프는 과거에 어떤 타임 스탬프에서 현재 타임 스탬프를 빼지 경우 1970 , 당신이이 2 개 스탬프 및 변환의 유일한 문제 사이의 정확한 초를 얻을 것이다 월 1 일 이후 초 basicly 금액입니다 그 이후의 초/일/시간/분. 윤년은 이것에 대한 부작용을 일으키지 않습니다. – rasjani

+0

그래, 아마도 나는 약간 불분명했다. 이 경우 부작용은 없지만 타임 스탬프 스타일의 두 번째 계산으로 정확한 날짜를 얻으려고하면 문제가 발생할 수 있습니다. 그래도 지적 해 주셔서 감사합니다. –

4

:

select date_format(from_unixtime(current_timestamp - last_timestamp), 
    'Last online: %e days, %k hours, %i minutes, %s seconds ago.'); 

DATE_FORMAT

가 특정 날짜를 기준으로 사용자 정의 문자열을 가질 수

(당신이 자리에서 계산하려는 경우 current_timestampunix_timestamp(now())로 대체 할 수있다). 두 개의 시간 소인의 차이로 날짜를 채우면 요청한대로 작동합니다.

위의 해결 방법은 한 달 미만인 경우에만 작동합니다. 일년 중 일을 원하면 % j를 사용하십시오. 이 함수에 대한 문서는 더 많은 것을 보여줍니다. 이 문서 밖으로

+0

합리적이지만 중복 된 정보가 표시됩니다 (예 : 0 일, 시간이 1 일 미만인 경우 –

0

당신이 필요로 정확히 (는 입력으로 분 도착) :

function minutes_to_time($minutes) 
{ 
    $obj = ""; 

    // extract days 
    $days = floor($minutes/(1440)); # Divide on the daily minutes 60 min * 24 hours 
    # echo "Days: " . $days; 

    // extract hours 
    $hours = floor(($minutes-($days*1440))/60); 
    # echo " Hours: " . $hours; 

    // extract left minutes 
    $minutes = ($minutes-($days*24*60)-($hours*60)); 
    # echo " Minutes: " . $minutes; 

    if ($days > 0) 
    { 
     $obj .= $days . "d "; 
    } 
    if ($hours > 0) 
    { 
     $obj .= $hours . "h "; 
    } 
    if ($minutes >= 0) 
    { 
     $obj .= $minutes . "m "; 
    } 

    $obj .= "ago"; 

    return $obj; 
} 
1

수십 개의 깨진 솔루션이나 반쪽 솔루션을 찾은 후에 UNIX 타임 스탬프에 대해 다음과 같은 기능을 구축했습니다.
세부 수준을 제한 할 수 있습니다 ...

echo timeDiff(1350297908);에 "5 분 42 초 전"이 표시됩니다.
echo timeDiff(1350297908, 1);은 "5 분 전"으로 표시됩니다.

function timeDiff($from, $levels=7){ 
    $now = time(); 
    $diff = ($from > $now) ? $from - $now : $now - $from; 
    $status = ($from > $now) ? ' away' : ' ago'; 
    $times = array(31536000, 2628000, 604800, 86400, 3600, 60, 1); 
    $words = array('year', 'month', 'week', 'day', 'hour', 'minute', 'second'); 
    $str = array(); 
    foreach ($times as $k=>$v){ 
     $val = floor($diff/$v); 
     if ($val) { 
      $str[] = $val .' '. $words[$k] . ($val==1 ? '' : 's'); 
      $levels--; 
     } 
     $diff %= $v; 
     if ($levels==0) break; 
    } 
    return implode(', ', $str) . $status; 
} 
관련 문제