Root/
<?php /* -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* # ***** BEGIN LICENSE BLOCK ***** # This file is part of Plume Framework, a simple PHP Application Framework. # Copyright (C) 2001-2007 Loic d'Anterroches and contributors. # # Plume Framework is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or # (at your option) any later version. # # Plume Framework is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # # ***** END LICENSE BLOCK ***** */ class Pluf_Date { /** * Get a GM Date in the format YYYY-MM-DD HH:MM:SS and returns a * string with the given format in the current timezone. * * @param string GMDate * @param string Format to be given to strftime ('%Y-%m-%d %H:%M:%S') * @return string Formated GMDate into the local time */ public static function gmDateToString( $gmdate , $format = '%Y-%m-%d %H:%M:%S' ) { $time = strtotime ( $gmdate . 'Z' ); return strftime ( $format , $time ); } /** * Get a GM Date in the format YYYY-MM-DD HH:MM:SS and returns a * string with the given format in GMT. * * @param string GMDate * @param string Format to be given to date ('c') * @return string Formated GMDate into GMT */ public static function gmDateToGmString( $gmdate , $format = 'c' ) { $time = strtotime ( $gmdate . 'Z' ); return date ( $format , $time ); } /** * Day compare. * * Compare if the first date is before or after the second date. * Returns: * 0 if the days are the same. * 1 if the first date is before the second. * -1 if the first date is after the second. * * @param string YYYY-MM-DD date. * @param string YYYY-MM-DD date (today local time). * @return int */ public static function dayCompare( $date1 , $date2 =null) { $date2 = ( is_null ( $date2 )) ? date ( 'Y-m-d' ) : $date2 ; if ( $date2 == $date1 ) return 0; if ( $date1 > $date2 ) return -1; return 1; } } /** * Set of functions to manage dates. */ /** * Compare two date and returns the number of seconds between the * first and the second. If only the date is given without time, the * end of the day is used (23:59:59). * * @param string Date to compare for ex: '2006-09-17 18:42:00' * @param string Second date to compare if null use now (null) * @return int Number of seconds between the two dates. Negative * value if the second date is before the first. */ function Pluf_Date_Compare( $date1 , $date2 =null) { if ( strlen ( $date1 ) == 10) { $date1 .= ' 23:59:59' ; } if ( is_null ( $date2 )) { $date2 = time(); } else { if ( strlen ( $date2 ) == 10) { $date2 .= ' 23:59:59' ; } $date2 = strtotime ( str_replace ( '-' , '/' , $date2 )); } $date1 = strtotime ( str_replace ( '-' , '/' , $date1 )); return $date2 - $date1 ; } /** * Display a date in the format: * X days Y hours ago * X hours Y minutes ago * X hours Y minutes left * * "resolution" is year, month, day, hour, minute. * * If not time is given, only the day, the end of the day is * used: 23:59:59. * * @param string Date to compare with ex: '2006-09-17 18:42:00' * @param string Reference date to compare with by default now (null) * @param int Maximum number of elements to show (2) * @param string If no delay between the two dates display ('now') * @param bool Show ago/left suffix * @return string Formatted date */ function Pluf_Date_Easy( $date , $ref =null, $blocks =2, $notime = 'now' , $show =true) { if ( strlen ( $date ) == 10) { $date .= ' 23:59:59' ; } if ( is_null ( $ref )) { $ref = date ( 'Y-m-d H:i:s' ); $tref = time(); } else { if ( strlen ( $ref ) == 10) { $ref .= ' 23:59:59' ; } $tref = strtotime ( str_replace ( '-' , '/' , $ref )); } $tdate = strtotime ( str_replace ( '-' , '/' , $date )); $past = true; if ( $tref < $tdate ) { // date in the past $past = false; $_tmp = $ref ; $ref = $date ; $date = $_tmp ; } $ref = str_replace ( array ( ' ' , ':' ), '-' , $ref ); $date = str_replace ( array ( ' ' , ':' ), '-' , $date ); $refs = split( '-' , $ref ); $dates = split( '-' , $date ); // Modulo on the month is dynamically calculated after $modulos = array (365, 12, 31, 24, 60, 60); // day in month $month = $refs [1] - 1; $modulos [2] = date ( 't' , mktime (0, 0, 0, $month , 1, $refs [0])); $diffs = array (); for ( $i =0; $i <6; $i ++) { $diffs [ $i ] = $refs [ $i ] - $dates [ $i ]; } $retain = 0; for ( $i =5; $i >-1; $i --) { $diffs [ $i ] = $diffs [ $i ] - $retain ; $retain = 0; if ( $diffs [ $i ] < 0) { $diffs [ $i ] = $modulos [ $i ] + $diffs [ $i ]; $retain = 1; } } $res = '' ; $total = 0; for ( $i =0; $i <5; $i ++) { if ( $diffs [ $i ] > 0) { $total ++; $res .= $diffs [ $i ]. ' ' ; switch ( $i ) { case 0: $res .= _n( 'year' , 'years' , $diffs [ $i ]); break ; case 1: $res .= _n( 'month' , 'months' , $diffs [ $i ]); break ; case 2: $res .= _n( 'day' , 'days' , $diffs [ $i ]); break ; case 3: $res .= _n( 'hour' , 'hours' , $diffs [ $i ]); break ; case 4: $res .= _n( 'minute' , 'minutes' , $diffs [ $i ]); break ; case 5: $res .= _n( 'second' , 'seconds' , $diffs [ $i ]); break ; } $res .= ' ' ; } if ( $total >= $blocks ) break ; } if ( strlen ( $res ) == 0) { return $notime ; } if ( $show ) { if ( $past ) { $res = sprintf(__( '%s ago' ), $res ); } else { $res = sprintf(__( '%s left' ), $res ); } } return $res ; } |