drupal-civicrm/sites/all/modules/civicrm/packages/DB/Table/Date.php

196 lines
6.2 KiB
PHP
Raw Permalink Normal View History

2018-01-14 15:10:16 +02:00
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Generic date handling class for DB_Table.
*
* Stripped down to two essential methods specially for DB_Table from the
* PEAR Date package by Paul M. Jones <pmjones@php.net>.
*
* PHP versions 4 and 5
*
* LICENSE:
*
* Copyright (c) 1997-2007, Paul M. Jones <pmjones@php.net>
* David C. Morse <morse@php.net>
* Mark Wiesemann <wiesemann@php.net>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * The names of the authors may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* @category Database
* @package DB_Table
* @author Baba Buehler <baba@babaz.com>
* @author Pierre-Alain Joye <pajoye@php.net>
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version CVS: $Id: Date.php,v 1.3 2007/12/13 16:52:14 wiesemann Exp $
* @link http://pear.php.net/package/DB_Table
*/
/**
* Generic date handling class for DB_Table.
*
* @category Database
* @package DB_Table
* @author Baba Buehler <baba@babaz.com>
* @author Pierre-Alain Joye <pajoye@php.net>
* @version Release: 1.5.6
* @link http://pear.php.net/package/DB_Table
*/
class DB_Table_Date {
/**
* the year
* @var int
*/
var $year;
/**
* the month
* @var int
*/
var $month;
/**
* the day
* @var int
*/
var $day;
/**
* the hour
* @var int
*/
var $hour;
/**
* the minute
* @var int
*/
var $minute;
/**
* the second
* @var int
*/
var $second;
/**
* the parts of a second
* @var float
*/
var $partsecond;
/**
* Constructor
*
* Creates a new DB_Table_Date Object. The date should be near to
* ISO 8601 format.
*
* @access public
* @param string $date A date in ISO 8601 format.
*/
function __construct($date)
{
// This regex is very loose and accepts almost any butchered
// format you could throw at it. e.g. 2003-10-07 19:45:15 and
// 2003-10071945:15 are the same thing in the eyes of this
// regex, even though the latter is not a valid ISO 8601 date.
preg_match('/^(\d{4})-?(\d{2})-?(\d{2})([T\s]?(\d{2}):?(\d{2}):?(\d{2})(\.\d+)?(Z|[\+\-]\d{2}:?\d{2})?)?$/i', $date, $regs);
$this->year = $regs[1];
$this->month = $regs[2];
$this->day = $regs[3];
$this->hour = isset($regs[5])?$regs[5]:0;
$this->minute = isset($regs[6])?$regs[6]:0;
$this->second = isset($regs[7])?$regs[7]:0;
$this->partsecond = isset($regs[8])?(float)$regs[8]:(float)0;
// if an offset is defined, convert time to UTC
// Date currently can't set a timezone only by offset,
// so it has to store it as UTC
if (isset($regs[9])) {
$this->toUTCbyOffset($regs[9]);
}
}
/**
* Date pretty printing, similar to strftime()
*
* Formats the date in the given format, much like
* strftime(). Most strftime() options are supported.<br><br>
*
* formatting options:<br><br>
*
* <code>%Y </code> year as decimal including century (range 0000 to 9999) <br>
* <code>%m </code> month as decimal number (range 01 to 12) <br>
* <code>%d </code> day of month (range 00 to 31) <br>
* <code>%H </code> hour as decimal number (00 to 23) <br>
* <code>%M </code> minute as a decimal number (00 to 59) <br>
* <code>%S </code> seconds as a decimal number (00 to 59) <br>
* <code>%% </code> literal '%' <br>
* <br>
*
* @access public
* @param string format the format string for returned date/time
* @return string date/time in given format
*/
function format($format)
{
$output = "";
for($strpos = 0; $strpos < strlen($format); $strpos++) {
$char = substr($format,$strpos,1);
if ($char == "%") {
$nextchar = substr($format,$strpos + 1,1);
switch ($nextchar) {
case "Y":
$output .= $this->year;
break;
case "m":
$output .= sprintf("%02d",$this->month);
break;
case "d":
$output .= sprintf("%02d",$this->day);
break;
case "H":
$output .= sprintf("%02d", $this->hour);
break;
case "M":
$output .= sprintf("%02d",$this->minute);
break;
case "S":
$output .= sprintf("%02d", $this->second);
break;
default:
$output .= $char.$nextchar;
}
$strpos++;
} else {
$output .= $char;
}
}
return $output;
}
}
?>