<?php
/**
*@author Andy
*@datetime 2014-6-6
*/
class HumanDate
{
static $MINUTE = 60;
static $HOUR = 3600; //static::$MINUTE * 60
static $DAY = 86400; //static::$HOUR * 24
static $WEEK = 604800; //static::$DAY * 7
static $MONTH = 2628000; //static::$YEAR / 12
static $YEAR = 31536000; //static::$DAY * 365
protected $formats; // ago
protected $futureformats; // future
/**
* Create new instance, initialize $formats array
*/
public function __construct()
{
$this->formats = array(
array(0.7 * static::$MINUTE, 'just now', 1),
array(1.5 * static::$MINUTE, 'a minute ago', 1),
array( 60 * static::$MINUTE, '%d minutes ago', static::$MINUTE),
array(1.5 * static::$HOUR, 'an hour ago', 1),
array( static::$DAY, '%d hours ago', static::$HOUR),
array( 2 * static::$DAY, 'yesterday', 1),
array( 7 * static::$DAY, '%d days ago', static::$DAY),
array(1.5 * static::$WEEK, 'a week ago', 1),
array( static::$MONTH, '%d weeks ago', static::$WEEK),
array(1.5 * static::$MONTH, 'a month ago', 1),
array( static::$YEAR, '%d months ago', static::$MONTH),
array(1.5 * static::$YEAR, 'a year ago', 1),
array(PHP_INT_MAX, '%d years ago', static::$YEAR)
);
$this->futureformats = array(
array(0.7 * static::$MINUTE, 'in a moment', -1),
array(1.5 * static::$MINUTE, 'in a minute', -1),
array( 60 * static::$MINUTE, 'in %d minutes', -static::$MINUTE),
array(1.5 * static::$HOUR, 'in an hour', -1),
array( static::$DAY, 'in %d hours', -static::$HOUR),
array( 2 * static::$DAY, 'tomorrow', -1),
array( 7 * static::$DAY, 'in %d days', -static::$DAY),
array(1.5 * static::$WEEK, 'in a week', -1),
array( static::$MONTH, 'in %d weeks', -static::$WEEK),
array(1.5 * static::$MONTH, 'in a month', -1),
array( static::$YEAR, 'in %d months', -static::$MONTH),
array(1.5 * static::$YEAR, 'in a year', -1),
array(PHP_INT_MAX, 'in %d years', -static::$YEAR)
);
}
/**
* @return string Human readable time difference ("a week ago")
*/
public function get($delta)
{
if (!is_numeric($delta)) {
return;
}
$delta = (int)$delta; // start - end
if ($delta >= 0) {
foreach ($this->formats as $format) {
if ($delta < $format[0]) {
return sprintf(
$format[1],
round($delta / $format[2])
);
}
};
} else {
foreach ($this->futureformats as $format) {
if (-$delta < $format[0]) {
return sprintf(
$format[1],
round($delta / $format[2])
);
}
};
}
}
}
?>
用法:
require_once 'HumanDate.php'; // 加载该类
$hd = new HumanDate(); // 初始化该类
echo $hd->get(40) ; //shows "just now" // 参数为unix时间戳。正数表示:现在-过去,显示ago;负数:现在-将来,显示future。
设计该类目的:用于格式化用户距今登陆日期,显示更符合人类习惯。
若想汉化为中文版,直接替换英文字符串即可。
若想使用Java、C#、Python、C++/C等等版本,请自觉自行重写该类。
设计该类目的:用于格式化用户距今登陆日期,显示更符合人类习惯。