PHP : 타임 스탬프에서 상대 날짜 / 시간 생성하기
PHPPHP : 타임 스탬프에서 상대 날짜 / 시간 생성하기
저는 기본적으로 유닉스 타임 스탬프 (time () 함수)를 과거와 미래의 날짜와 호환되는 상대 날짜 / 시간으로 변환하려고합니다. 출력은 다음과 같습니다.
먼저 코드를 작성하려고했으나 유지할 수없는 큰 기능을 만들었습니다. 그런 다음 인터넷을 두 시간 동안 검색했지만 아직 찾을 수있는 부분은 시간의 일부만 생성하는 스크립트입니다 (예 : "1 시간 전"없이 분).
이미이 작업을 수행하고있는 스크립트가 있습니까?
해결법
-
==============================
1.이 함수는 '지금'과 '특정 시간 소인'사이의 결과처럼 '1 시간 전'또는 '내일'을 제공합니다.
이 함수는 '지금'과 '특정 시간 소인'사이의 결과처럼 '1 시간 전'또는 '내일'을 제공합니다.
function time2str($ts) { if(!ctype_digit($ts)) $ts = strtotime($ts); $diff = time() - $ts; if($diff == 0) return 'now'; elseif($diff > 0) { $day_diff = floor($diff / 86400); if($day_diff == 0) { if($diff < 60) return 'just now'; if($diff < 120) return '1 minute ago'; if($diff < 3600) return floor($diff / 60) . ' minutes ago'; if($diff < 7200) return '1 hour ago'; if($diff < 86400) return floor($diff / 3600) . ' hours ago'; } if($day_diff == 1) return 'Yesterday'; if($day_diff < 7) return $day_diff . ' days ago'; if($day_diff < 31) return ceil($day_diff / 7) . ' weeks ago'; if($day_diff < 60) return 'last month'; return date('F Y', $ts); } else { $diff = abs($diff); $day_diff = floor($diff / 86400); if($day_diff == 0) { if($diff < 120) return 'in a minute'; if($diff < 3600) return 'in ' . floor($diff / 60) . ' minutes'; if($diff < 7200) return 'in an hour'; if($diff < 86400) return 'in ' . floor($diff / 3600) . ' hours'; } if($day_diff == 1) return 'Tomorrow'; if($day_diff < 4) return date('l', $ts); if($day_diff < 7 + (7 - date('w'))) return 'next week'; if(ceil($day_diff / 7) < 4) return 'in ' . ceil($day_diff / 7) . ' weeks'; if(date('n', $ts) == date('n') + 1) return 'next month'; return date('F Y', $ts); } }
-
==============================
2.
function relativeTime($time) { $d[0] = array(1,"second"); $d[1] = array(60,"minute"); $d[2] = array(3600,"hour"); $d[3] = array(86400,"day"); $d[4] = array(604800,"week"); $d[5] = array(2592000,"month"); $d[6] = array(31104000,"year"); $w = array(); $return = ""; $now = time(); $diff = ($now-$time); $secondsLeft = $diff; for($i=6;$i>-1;$i--) { $w[$i] = intval($secondsLeft/$d[$i][0]); $secondsLeft -= ($w[$i]*$d[$i][0]); if($w[$i]!=0) { $return.= abs($w[$i]) . " " . $d[$i][1] . (($w[$i]>1)?'s':'') ." "; } } $return .= ($diff>0)?"ago":"left"; return $return; }
용법:
echo relativeTime((time()-256)); 4 minutes 16 seconds ago
-
==============================
3.여기 제가 작성한 것이 있습니다. 오늘 날짜를 기준으로 과거 날짜를 표시합니다.
여기 제가 작성한 것이 있습니다. 오늘 날짜를 기준으로 과거 날짜를 표시합니다.
/** * @param $date integer of unixtimestamp format, not actual date type * @return string */ function zdateRelative($date) { $now = time(); $diff = $now - $date; if ($diff < 60){ return sprintf($diff > 1 ? '%s seconds ago' : 'a second ago', $diff); } $diff = floor($diff/60); if ($diff < 60){ return sprintf($diff > 1 ? '%s minutes ago' : 'one minute ago', $diff); } $diff = floor($diff/60); if ($diff < 24){ return sprintf($diff > 1 ? '%s hours ago' : 'an hour ago', $diff); } $diff = floor($diff/24); if ($diff < 7){ return sprintf($diff > 1 ? '%s days ago' : 'yesterday', $diff); } if ($diff < 30) { $diff = floor($diff / 7); return sprintf($diff > 1 ? '%s weeks ago' : 'one week ago', $diff); } $diff = floor($diff/30); if ($diff < 12){ return sprintf($diff > 1 ? '%s months ago' : 'last month', $diff); } $diff = date('Y', $now) - date('Y', $date); return sprintf($diff > 1 ? '%s years ago' : 'last year', $diff); }
-
==============================
4.나는 xdebug에 의해 relativeTime 함수를 좋아한다. 문제는 약간의 세분화가 필요하다는 것입니다.
나는 xdebug에 의해 relativeTime 함수를 좋아한다. 문제는 약간의 세분화가 필요하다는 것입니다.
즉, 내가 결정하면 초 또는 분 단위로 중지합니다. 그래서 지금,
echo fTime(strtotime('-23 hours 5 minutes 55 seconds'),0);
보여줄 것입니다,
대신에
또한 더 높은 시간 량에 도달하면 배열에서 더 낮게 가지 않기를 원했습니다. 그래서 몇 년을 보여 주면, 나는 단지 몇 년과 몇 달을 보여주고 싶습니다. 그래서 지금,
echo fTime(strtotime('-1 year 2 months 3 weeks 4 days 16 hours 15 minutes 22 seconds'),0);
보여 줄까요?
대신에
다음 코드 변경은 내가 필요한 것을 수행했다. 소품은 물론 xdebug에갑니다. 바라건대 다른 누군가가 유용하다고 생각하기를 바랍니다.
function fTime($time, $gran=-1) { $d[0] = array(1,"second"); $d[1] = array(60,"minute"); $d[2] = array(3600,"hour"); $d[3] = array(86400,"day"); $d[4] = array(604800,"week"); $d[5] = array(2592000,"month"); $d[6] = array(31104000,"year"); $w = array(); $return = ""; $now = time(); $diff = ($now-$time); $secondsLeft = $diff; $stopat = 0; for($i=6;$i>$gran;$i--) { $w[$i] = intval($secondsLeft/$d[$i][0]); $secondsLeft -= ($w[$i]*$d[$i][0]); if($w[$i]!=0) { $return.= abs($w[$i]) . " " . $d[$i][1] . (($w[$i]>1)?'s':'') ." "; switch ($i) { case 6: // shows years and months if ($stopat==0) { $stopat=5; } break; case 5: // shows months and weeks if ($stopat==0) { $stopat=4; } break; case 4: // shows weeks and days if ($stopat==0) { $stopat=3; } break; case 3: // shows days and hours if ($stopat==0) { $stopat=2; } break; case 2: // shows hours and minutes if ($stopat==0) { $stopat=1; } break; case 1: // shows minutes and seconds if granularity is not set higher break; } if ($i===$stopat) { break 0; } } } $return .= ($diff>0)?"ago":"left"; return $return; }
마커스
-
==============================
5.아래에 나와있는 결과를 줄 필요가있어서 자기 자신을 썼다. 바라기를 이것은 누군가를 도울 것입니다.
아래에 나와있는 결과를 줄 필요가있어서 자기 자신을 썼다. 바라기를 이것은 누군가를 도울 것입니다.
사용 예 :
$datetime = "2014-08-13 12:52:48"; echo getRelativeTime($datetime); //10 hours ago echo getRelativeTime($datetime, 1); //10 hours ago echo getRelativeTime($datetime, 2); //10 hours and 50 minutes ago echo getRelativeTime($datetime, 3); //10 hours, 50 minutes and 50 seconds ago echo getRelativeTime($datetime, 4); //10 hours, 50 minutes and 50 seconds ago
암호:
public function getRelativeTime($datetime, $depth=1) { $units = array( "year"=>31104000, "month"=>2592000, "week"=>604800, "day"=>86400, "hour"=>3600, "minute"=>60, "second"=>1 ); $plural = "s"; $conjugator = " and "; $separator = ", "; $suffix1 = " ago"; $suffix2 = " left"; $now = "now"; $empty = ""; # DO NOT EDIT BELOW $timediff = time()-strtotime($datetime); if ($timediff == 0) return $now; if ($depth < 1) return $empty; $max_depth = count($units); $remainder = abs($timediff); $output = ""; $count_depth = 0; $fix_depth = true; foreach ($units as $unit=>$value) { if ($remainder>$value && $depth-->0) { if ($fix_depth) { $max_depth -= ++$count_depth; if ($depth>=$max_depth) $depth=$max_depth; $fix_depth = false; } $u = (int)($remainder/$value); $remainder %= $value; $pluralise = $u>1?$plural:$empty; $separate = $remainder==0||$depth==0?$empty: ($depth==1?$conjugator:$separator); $output .= "{$u} {$unit}{$pluralise}{$separate}"; } $count_depth++; } return $output.($timediff<0?$suffix2:$suffix1); }
-
==============================
6.packagist를 통해 Carbon을 사용할 수 있습니다. :) https://github.com/briannesbitt/Carbon#api-humandiff
packagist를 통해 Carbon을 사용할 수 있습니다. :) https://github.com/briannesbitt/Carbon#api-humandiff
-
==============================
7.다음은 과거의 시간에 사용하는 것입니다.
다음은 과거의 시간에 사용하는 것입니다.
function zdateRelative($date) { $diff = time() - $date; $periods[] = [60, 1, '%s seconds ago', 'a second ago']; $periods[] = [60*100, 60, '%s minutes ago', 'one minute ago']; $periods[] = [3600*70, 3600, '%s hours ago', 'an hour ago']; $periods[] = [3600*24*10, 3600*24, '%s days ago', 'yesterday']; $periods[] = [3600*24*30, 3600*24*7, '%s weeks ago', 'one week ago']; $periods[] = [3600*24*30*30, 3600*24*30, '%s months ago', 'last month']; $periods[] = [INF, 3600*24*265, '%s years ago', 'last year']; foreach ($periods as $period) { if ($diff > $period[0]) continue; $diff = floor($diff / $period[1]); return sprintf($diff > 1 ? $period[2] : $period[3], $diff); } }
-
==============================
8.드루팔 (Drupal)이하는 방식을 왜 찢어 버리지 않는지 - http://api.drupal.org/api/drupal/includes%21common.inc/function/format_interval/7
드루팔 (Drupal)이하는 방식을 왜 찢어 버리지 않는지 - http://api.drupal.org/api/drupal/includes%21common.inc/function/format_interval/7
<?php function format_interval($interval, $granularity = 2, $langcode = NULL) { $units = array( '1 year|@count years' => 31536000, '1 month|@count months' => 2592000, '1 week|@count weeks' => 604800, '1 day|@count days' => 86400, '1 hour|@count hours' => 3600, '1 min|@count min' => 60, '1 sec|@count sec' => 1, ); $output = ''; foreach ($units as $key => $value) { $key = explode('|', $key); if ($interval >= $value) { $output .= ($output ? ' ' : '') . format_plural(floor($interval / $value), $key[0], $key[1], array(), array('langcode' => $langcode)); $interval %= $value; $granularity--; } if ($granularity == 0) { break; } } return $output ? $output : t('0 sec', array(), array('langcode' => $langcode)); } ?>
아마도 t ()를 대체 할 필요는 없으며 여러 언어를 지원할 필요가 없으므로 format_plural에 대한 자신 만의 일을 할 수 있습니다. http://api.drupal.org/api/drupal/includes%21common.inc/function/format_plural/7
from https://stackoverflow.com/questions/2690504/php-producing-relative-date-time-from-timestamps by cc-by-sa and MIT license
'PHP' 카테고리의 다른 글
eval을 사용하여 문자열에서 수학 표현식 계산 (0) | 2018.09.13 |
---|---|
glob () - 날짜순 정렬 (0) | 2018.09.13 |
다차원 배열을 1 차원 배열로 바꾸기 (0) | 2018.09.13 |
공유 호스팅에서 마술 따옴표를 끄는 방법? (0) | 2018.09.13 |
"치명적인 오류 : PHP의 최대 기능 중첩 수준 '100'도달, 중단 중!" (0) | 2018.09.13 |