X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=include%2Fdatetime.php;h=b0279492b1e7e803fbfca6b2a98ca7c9fc78ee37;hb=67e827e128a4c446b89f581793f64fd0f1299389;hp=0beadbe78ebc0e5e774f69df0ce87c7232705746;hpb=cb54cda17454fde783c165c37d6ece1ba2067253;p=friendica.git diff --git a/include/datetime.php b/include/datetime.php index 0beadbe78e..b0279492b1 100644 --- a/include/datetime.php +++ b/include/datetime.php @@ -1,17 +1,20 @@ '; $continent = $ex[0]; - $o .= ""; + $o .= ''; } if(count($ex) > 2) $city = substr($value,strpos($value,'/')+1); @@ -38,13 +41,13 @@ function select_timezone($current = 'America/Los_Angeles') { } else { $city = $ex[0]; - if($continent != 'Miscellaneous') { + if($continent != t('Miscellaneous')) { $o .= ''; - $continent = 'Miscellaneous'; - $o .= ""; + $continent = t('Miscellaneous'); + $o .= ''; } } - $city = str_replace('_', ' ', $city); + $city = str_replace('_', ' ', t($city)); $selected = (($value == $current) ? " selected=\"selected\" " : ""); $o .= ""; } @@ -52,101 +55,131 @@ function select_timezone($current = 'America/Los_Angeles') { return $o; }} +// General purpose date parse/convert function. +// $from = source timezone +// $to = dest timezone +// $s = some parseable date/time string +// $fmt = output format if(! function_exists('datetime_convert')) { function datetime_convert($from = 'UTC', $to = 'UTC', $s = 'now', $fmt = "Y-m-d H:i:s") { - $d = new DateTime($s, new DateTimeZone($from)); - $d->setTimeZone(new DateTimeZone($to)); - return($d->format($fmt)); + + // Slight hackish adjustment so that 'zero' datetime actually returns what is intended + // otherwise we end up with -0001-11-30 ... + // add 32 days so that we at least get year 00, and then hack around the fact that + // months and days always start with 1. + + if(substr($s,0,10) == '0000-00-00') { + $d = new DateTime($s . ' + 32 days', new DateTimeZone('UTC')); + return str_replace('1','0',$d->format($fmt)); + } + + $d = new DateTime($s, new DateTimeZone($from)); + $d->setTimeZone(new DateTimeZone($to)); + return($d->format($fmt)); }} +// wrapper for date selector, tailored for use in birthday fields + +function dob($dob) { + list($year,$month,$day) = sscanf($dob,'%4d-%2d-%2d'); + $y = datetime_convert('UTC',date_default_timezone_get(),'now','Y'); + $o = datesel('',1920,$y,true,$year,$month,$day); + return $o; +} +// returns a date selector. +// $pre = prefix (if needed) for HTML name and class fields +// $ymin = first year shown in selector dropdown +// $ymax = last year shown in selector dropdown +// $allow_blank = allow an empty response on any field +// $y = already selected year +// $m = already selected month +// $d = already selected day + if(! function_exists('datesel')) { function datesel($pre,$ymin,$ymax,$allow_blank,$y,$m,$d) { $o = ''; $o .= "- - "; return $o; }} +// implements "3 seconds ago" etc. +// based on $posted_date, (UTC). +// Results relative to current timezone +// Limited to range of timestamps -// TODO rewrite this buggy sucker +if(! function_exists('relative_date')) { function relative_date($posted_date) { $localtime = datetime_convert('UTC',date_default_timezone_get(),$posted_date); - - $in_seconds = strtotime($localtime); - $diff = time() - $in_seconds; + $abs = strtotime($localtime); + $etime = time() - $abs; + + if ($etime < 1) { + return t('less than a second ago'); + } + + $a = array( 12 * 30 * 24 * 60 * 60 => array( t('year'), t('years')), + 30 * 24 * 60 * 60 => array( t('month'), t('months')), + 7 * 24 * 60 * 60 => array( t('week'), t('weeks')), + 24 * 60 * 60 => array( t('day'), t('days')), + 60 * 60 => array( t('hour'), t('hours')), + 60 => array( t('minute'), t('minutes')), + 1 => array( t('second'), t('seconds')) + ); - $months = floor($diff/2592000); - $diff -= $months*2419200; - $weeks = floor($diff/604800); - $diff -= $weeks*604800; - $days = floor($diff/86400); - $diff -= $days*86400; - $hours = floor($diff/3600); - $diff -= $hours*3600; - $minutes = floor($diff/60); - $diff -= $minutes*60; - $seconds = $diff; - - if($months > 2) - return(datetime_convert('UTC',date_default_timezone_get(),$posted_date,'\o\n Y-m-d \a\t H:i:s')); - if ($months>0) { - // over a month old, - return 'over a month ago'; - } else { - if ($weeks>0) { - // weeks and days - $relative_date .= ($relative_date?', ':'').$weeks.' week'.($weeks!=1 ?'s':''); - - } elseif ($days>0) { - // days and hours - $relative_date .= ($relative_date?', ':'').$days.' day'.($days!=1?'s':''); - - } elseif ($hours>0) { - // hours and minutes - $relative_date .= ($relative_date?', ':'').$hours.' hour'.($hours!=1?'s':''); - - } elseif ($minutes>0) { - // minutes only - $relative_date .= ($relative_date?', ':'').$minutes.' minute'.($minutes!=1?'s':''); - } else { - // seconds only - $relative_date .= ($relative_date?', ':'').$seconds.' second'.($seconds!=1?'s':''); + foreach ($a as $secs => $str) { + $d = $etime / $secs; + if ($d >= 1) { + $r = round($d); + return $r . ' ' . (($r == 1) ? $str[0] : $str[1]) . t(' ago'); } } - // show relative date and add proper verbiage - return $relative_date.' ago'; -} +}} + + +// Returns age in years, given a date of birth, +// the timezone of the person whose date of birth is provided, +// and the timezone of the person viewing the result. +// Why? Bear with me. Let's say I live in Mittagong, Australia, and my +// birthday is on New Year's. You live in San Bruno, California. +// When exactly are you going to see my age increase? +// A: 5:00 AM Dec 31 San Bruno time. That's precisely when I start +// celebrating and become a year older. If you wish me happy birthday +// on January 1 (San Bruno time), you'll be a day late. + function age($dob,$owner_tz = '',$viewer_tz = '') { - if(strlen($dob) != 10) + if(! intval($dob)) return 0; if(! $owner_tz) $owner_tz = date_default_timezone_get();