<?php
/**
* 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 14840 2020年01月07日 07:42:38Z pdontthink $
* @package squirrelmail
* @subpackage date
*/
/** Load up some useful constants */
require_once(SM_PATH . 'functions/constants.php');
/**
* 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 */
if ($stamp == -1) {
return -1;
}
/* timezone correction, expressed as `shhmm' */
switch($tzc)
{
case 'Pacific':
case 'PST':
$tzc = '-0800';
break;
case 'Mountain':
case 'MST':
case 'PDT':
$tzc = '-0700';
break;
case 'Central':
case 'CST':
case 'MDT':
$tzc = '-0600';
break;
case 'Eastern':
case 'EST':
case 'CDT':
$tzc = '-0500';
break;
case 'EDT':
$tzc = '-0400';
break;
case 'GMT':
$tzc = '+0000';
break;
case 'BST':
case 'MET':
case 'CET':
$tzc = '+0100';
break;
case 'EET':
case 'IST':
case 'MET DST':
case 'METDST':
case 'CEST':
case 'MEST':
$tzc = '+0200';
break;
case 'HKT':
$tzc = '+0800';
break;
case 'JST':
case 'KST':
$tzc = '+0900';
break;
}
$neg = false;
if (substr ($tzc, 0, 1) ==
'-') {
$neg = true;
} else if (substr ($tzc, 0, 1) !=
'+') {
$tzc = '+'.$tzc;
}
$iTzc = ($hh * 60 + $mm) * 60;
if ($neg) $iTzc = -1 * (int) $iTzc;
/* stamp in gmt */
$stamp -= $iTzc;
/** now find what the server is at **/
/* stamp in local timezone */
$stamp += $current;
return $stamp;
}
/**
* 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
* main po.
*
* @param int day_number the day number
* @return string the day in human readable form
*/
switch( $day_number ) {
case 0:
break;
case 1:
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
case 6:
break;
default:
$ret = '';
}
return( $ret );
}
/**
* Like getDayName, but returns the short form
* @param int day_number the day number
* @return string the day in short human readable form
*/
switch( $day_number ) {
case 0:
break;
case 1:
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
case 6:
break;
default:
$ret = '';
}
return( $ret );
}
/**
* 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 ) {
case '01':
break;
case '02':
break;
case '03':
break;
case '04':
break;
case '05':
break;
case '06':
break;
case '07':
break;
case '08':
break;
case '09':
break;
case '10':
break;
case '11':
break;
case '12':
break;
default:
$ret = '';
}
return( $ret );
}
/**
* Returns the (localized) string for a given month number,
* short representation.
*
* @param string month_number the month number (01..12)
* @return string the shortened month in human readable form
*/
switch( $month_number ) {
case '01':
break;
case '02':
break;
case '03':
break;
case '04':
break;
case '05':
break;
case '06':
break;
case '07':
break;
case '08':
break;
case '09':
break;
case '10':
break;
case '11':
break;
case '12':
break;
default:
$ret = '';
}
return( $ret );
}
/**
* 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
*/
function date_intl ( $date_format, $stamp ) {
$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
$aParts[2]);
return( $ret );
}
/**
* 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
*/
global $hour_format;
if ($stamp == -1) {
return $fallback;
}
$date_format =
_ ("D, F j, Y g:i a");
} else {
$date_format =
_ ("D, F j, Y H:i");
}
return( date_intl ( $date_format, $stamp ) );
}
/**
* 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,
* ignore all
* user settings
* and use full
* date and time
* (OPTIONAL;
* default FALSE)
* @return string the date string
*/
function getDateString ( $stamp, $return_full_date_and_time=
FALSE ) {
if ( $stamp == -1 ) {
return '';
}
$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?
if ($invert_time) {
$dateZ = - $dateZ;
}
// 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
// one whole day away.
if ($now - $midnight > 86400) {
$midnight += 86400;
}
$nextmid = $midnight + 86400;
if ($return_full_date_and_time) {
$date_format =
_ ("D, F j, Y g:i a");
} else {
$date_format =
_ ("D, F j, Y H:i");
}
} else if (($show_full_date == 1) || ($nextmid < $stamp)) {
$date_format =
_ ("M j, Y");
} else if ($midnight < $stamp) {
/* Today */
$date_format =
_ ("g:i a");
} else {
$date_format =
_ ("H:i");
}
} else if ($midnight - 518400 < $stamp) {
/* This week */
$date_format =
_ ("D, g:i a");
} else {
$date_format =
_ ("D, H:i");
}
} else {
/* before this week */
$date_format =
_ ("M j, Y");
}
return( date_intl ( $date_format, $stamp ) );
}
/**
* 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) {
return -1;
} else if (count ($dateParts) ==
3) {
// dd-Month-yyyy 23:19:05 +0200
// redefine the date
$aDate =
explode ('-',$dateParts[0]);
$newDate = array($aDate[0],$aDate[1],$aDate[2],$dateParts[1],$dateParts[2]);
$dateParts = $newDate;
}
}
/*
* 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];
} else {
/* just drop the day of the week */
}
}
/* calculate timestamp separated from the zone and obs-zone */
if (!isset($dateParts[0])) {
$dateParts[0] = '+0000';
}
if (!preg_match ('/^[+-]{1}[0-9]{4}$/',$dateParts[0])) {
/* zone in obs-zone format */
if (preg_match ('/\((.+)\)/',$dateParts[0],$regs)) {
$obs_zone = $regs[1];
} else {
$obs_zone = $dateParts[0];
}
} else {
}
}
/* I use this function for profiling. Should never be called in
actual versions of squirrelmail released to public. */
/*
function getmicrotime() {
$mtime = microtime();
$mtime = explode(' ',$mtime);
$mtime = $mtime[1] + $mtime[0];
return ($mtime);
}
*/