Source for file date.php
Documentation is available at date.php
* Takes a date and parses it into a usable format. The form that a
* date SHOULD arrive in is:
* <Tue,> 29 Jun 1999 09:52:11 -0500 (EDT)
* (as specified in RFC 822) -- 'Tue' is optional
* @copyright 1999-2020 The SquirrelMail Project Team
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
* @version $Id: date.php 14845 2020-01-07 08:09:34Z pdontthink $
* Corrects a time stamp to be the local time.
* @param int stamp the timestamp to adjust
* @param string tzc the timezone correction
* @return int the corrected timestamp
/* date couldn't be parsed */
/* timezone correction, expressed as `shhmm' */
if (substr($tzc, 0, 1) ==
'-') {
} else if (substr($tzc, 0, 1) !=
'+') {
$iTzc =
($hh *
60 +
$mm) *
60;
if ($neg) $iTzc = -
1 * (int)
$iTzc;
/* now find what the server is at */
/* stamp in local timezone */
* Returns the (localized) string for a given day number.
* Switch system has been intentionaly chosen for the
* internationalization of month and day names. The reason
* is to make sure that _("") strings will go into the
* @param int day_number the day number
* @return string the day in human readable form
* Like getDayName, but returns the short form
* @param int day_number the day number
* @return string the day in short human readable form
* Returns the (localized) string for a given month number.
* @param string month_number the month number (01..12)
* @return string the month name in human readable form
switch( $month_number ) {
* Returns the (localized) string for a given month number,
* @param string month_number the month number (01..12)
* @return string the shortened month in human readable form
switch( $month_number ) {
* Returns the localized representation of the date/time.
* @param string date_format The format for the date, like the input for the PHP date() function.
* @param int stamp the timestamp to convert
* @return string a full date representation
$ret =
str_replace( array('D','F','l','M'), array('$1','$2','$3','$4'), $date_format );
// to reduce the date calls we retrieve m and w in the same call
$ret =
date('w#m#'.
$ret, $stamp );
// extract day and month in order to replace later by intl day and month
* This returns a date of the format "Wed, Oct 29, 2003 9:52 am",
* or the same in 24H format (depending on the user's settings),
* and taking localization into accout.
* @param int stamp the timestamp
* @param string fallback string to use when stamp not valid
* @return string the long date string
$date_format =
_("D, F j, Y g:i a");
$date_format =
_("D, F j, Y H:i");
* Returns a short representation of the date,
* taking timezones and localization into account.
* Depending on user's settings, this string can be
* of the form: "14:23" or "Jun 14, 2003" depending
* on whether the stamp is "today" or not.
* @param int $stamp The timestamp
* @param boolean $return_full_date_and_time When TRUE,
* @return string the date string
function getDateString( $stamp, $return_full_date_and_time=
FALSE ) {
global $invert_time, $hour_format, $show_full_date, $custom_date_format;
$dateZ =
date('Z', $now );
// FIXME: isn't this obsolete and introduced as a terrible workaround
// for bugs at other places which are fixed a long time ago?
// calculate when it was midnight and when it will be,
// in order to display dates differently if they're 'today'
$midnight =
$now -
($now %
86400) -
$dateZ;
// this is to correct if after calculations midnight is more than
if ($now -
$midnight >
86400) {
$nextmid =
$midnight +
86400;
$custom_date_format =
trim($custom_date_format);
if ($return_full_date_and_time) {
$date_format =
_("D, F j, Y g:i a");
$date_format =
_("D, F j, Y H:i");
} else if (!empty($custom_date_format)) {
$date_format =
$custom_date_format;
} else if ($show_full_date ==
1 ||
$nextmid <
$stamp) {
$date_format =
_("M j, Y");
} else if ($midnight <
$stamp) {
$date_format =
_("g:i a");
} else if ($midnight -
518400 <
$stamp) {
$date_format =
_("D, g:i a");
$date_format =
_("D, H:i");
$date_format =
_("M j, Y");
* Decodes a RFC 822 Date-header into a timestamp
* @param array dateParts the Date-header split by whitespace
* @return int the timestamp calculated from the header
/* $dateParts[0] == <day of week> Mon, Tue, Wed
* $dateParts[1] == <day of month> 23
* $dateParts[2] == <month> Jan, Feb, Mar
* $dateParts[3] == <year> 1999
* $dateParts[4] == <time> 18:54:23 (HH:MM:SS)
* $dateParts[5] == <from GMT> +0100
* $dateParts[6] == <zone> (EDT)
* NOTE: In RFC 822, it states that <day of week> is optional.
* In that case, dateParts[0] would be the <day of month>
* and everything would be bumped up one.
if (count($dateParts) <
2) {
} else if (count($dateParts) ==
3) {
// dd-Month-yyyy 23:19:05 +0200
$aDate =
explode('-',$dateParts[0]);
$newDate =
array($aDate[0],$aDate[1],$aDate[2],$dateParts[1],$dateParts[2]);
* Simply check to see if the first element in the dateParts
* array is an integer or not.
* Since the day of week is optional, this check is needed.
/* cope with broken mailers that send "Tue,23" without space */
if ( preg_match ('/^\w+,(\d{1,2})$/', $dateParts[0], $match) ) {
/* replace Tue,23 with 23 */
$dateParts[0] =
$match[1];
/* just drop the day of week */
/* calculate timestamp separated from the zone and obs-zone */
if (!isset
($dateParts[0])) {
if (!preg_match('/^[+-]{1}[0-9]{4}$/',$dateParts[0])) {
/* zone in obs-zone format */
if (preg_match('/\((.+)\)/',$dateParts[0],$regs)) {
$obs_zone =
$dateParts[0];
Documentation generated on Mon, 13 Jan 2020 04:22:16 +0100 by phpDocumentor 1.4.3