दिलचस्प पोस्ट
फ़ायरफ़ॉक्स को संस्करण 50 में अपडेट करने के बाद क्यों फ़ायरबग निकाल दिया गया? event.preventDefault () बनाम वापसी लौटा (कोई jQuery नहीं) कैसे एक वर्ग के सभी गुणों के माध्यम से पाश? विंडोज पर PHP और अपाचे के लिए Imagick स्थापित करें आईफोन लैंडस्केप एफएक्यू और सॉल्यूशंस मैं सी # में एक स्थिर विधि से एक गैर-स्थिर विधि कैसे कॉल करूं? जीसीसी में थ्रेड-सुरक्षित कार्य स्थिर चर हैं? जावास्क्रिप्ट बैकस्लैश (\) वेरिएबल्स में एक त्रुटि पैदा कर रहा है MySQL – SELECT WHERE फ़ील्ड IN (subquery) – अत्यंत धीमा क्यों? एसबीटी बाहर निकलने के बिना चलना बंद करो PHP चेतावनी अनुमति से इनकार (13) session_start पर () क्या ऊंचाई और चौड़ाई अवधि के लिए लागू नहीं होती है? विजुअल स्टूडियो 2012 में 'बैकग्राउंड ऑपरेशन के लिए प्रतीक्षा' क्या है? स्कला में सही-सहनीय तरीके क्या हैं? जब मैं एच का प्रयोग करना चाहिए: h: commandLink के बजाय outputLink?

PHP: टाइमस्टैम्प से सापेक्ष तिथि / समय का उत्पादन

मैं मूल रूप से एक यूनिक्स टाइमस्टैम्प (समय () फ़ंक्शन) को एक सापेक्ष तिथि / समय में बदलने की कोशिश कर रहा हूं जो कि पिछले और भविष्य की तिथि के साथ संगत है। इसलिए आउटपुट हो सकते हैं:

2 सप्ताह पहले

1 घंटे और 60 मिनट पहले

15 मिनट और 54 सेकंड पहले

10 मिनट और 15 सेकंड के बाद

सबसे पहले मैंने इसे कोडित करने की कोशिश की, लेकिन एक बहुत ही अनगिनत कार्य किया, और फिर मैंने दो घंटे के लिए इंटरनेट की खोज की, फिर भी मैं जो स्क्रिप्ट देख सकता हूं वह समय केवल एक ही भाग का उत्पादन करती है (एह: "1 घंटा पहले" मिनट)।

क्या आपके पास ऐसा स्क्रिप्ट है जो पहले से ही करता है?

Solutions Collecting From Web of "PHP: टाइमस्टैम्प से सापेक्ष तिथि / समय का उत्पादन"

यह फ़ंक्शन आपको 'अब' और 'विशिष्ट टाइमस्टैम्प' के बीच के परिणामों की तरह "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); } } 
 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 

यहां मैंने जो लिखा है वह है। आज की तारीख के संबंध में एक पिछली तारीख प्रदर्शित करता है

 /** * @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); } 

मुझे रिश्तेदार टाइम फ़ंक्शन xdebug से पसंद है I समस्या है कि मुझे कुछ ग्रैन्युलैरिटी होने की ज़रूरत है।

दूसरे शब्दों में, अगर मैं निर्णय करता हूँ तो सेकंड या मिनट में बंद हो जाता है तो अब,

 echo fTime(strtotime('-23 hours 5 minutes 55 seconds'),0); 

दिखाएगा,

23 घंटे, 5 मिनट पहले

के बजाय

23 घंटे, 5 मिनट, 55 सेकंड पहले

मैं यह भी चाहता हूं कि यह सरणी में कम न हो, अगर यह उच्च समय की मात्रा में से एक हो। तो अगर यह साल दिखाता है, तो मैं केवल साल और महीनों को दिखाना चाहता हूं। तो अब,

 echo fTime(strtotime('-1 year 2 months 3 weeks 4 days 16 hours 15 minutes 22 seconds'),0); 

दिखाएगा

1 साल, 2 महीने पहले

के बजाय

1 साल, 2 महीने, 3 सप्ताह, 4 दिन, 16 घंटे, 15 मिनट, 22 सेकंड पहले

निम्नलिखित कोड परिवर्तन की आवश्यकता थी जो मुझे चाहिए। प्रोप्स एक्सडबैग पर जाने के लिए पहले कोर्स करते हैं उम्मीद है कि किसी और को यह उपयोगी हो सकता है:

 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; } 

मार्कस

मुझे नीचे दिए गए परिणामों को देने के लिए मुझे एक की आवश्यकता है, इसलिए मैंने अपना अपना लिखा। उम्मीद है, यह किसी को मदद करेगा

उदाहरण उपयोग:

 $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); } 

आप पैकगलिस्ट के माध्यम से कार्बन का इस्तेमाल कर सकते हैं, बस अद्भुत 🙂 https://github.com/briannesbitt/Carbon#api-humandiff

क्यों नहीं 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)); } ?> 

संभवत: आपको टी () के लिए प्रतिस्थापन की आवश्यकता नहीं है और आप format_plural के लिए अपनी खुद की चीज़ को आसानी से कर सकते हैं क्योंकि आप (शायद) को कई भाषाओं का समर्थन नहीं करना है http://api.drupal.org/api/drupal/includes%21common.inc/function/format_plural/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); } }