<?php
/**
* Display the time in a text format
*
* Usage:
* $Time = new LITERAL_TIME();
* echo $Time->Time();
*
* To display current time without Meridiem:
* $Time = new LITERAL_TIME(null, false);
* echo $Time->Time();
*
* Author: Bryan Smith (http://smokeyb.com)
*/
class LITERAL_TIME
{
const MIDNIGHT = 'Midnight';
const NOON = 'Noon';
const QUARTER_TO = 'Quarter To';
const QUARTER_AFTER = 'Quarter After';
const AT_NIGHT = 'at Night';
const IN_THE_EVENING = 'in the Evening';
const IN_THE_MORNING = 'in the Morning';
const IN_THE_AFTERNOON = 'in the Afternoon';
/**
* The text version of the hour
*
* @var String
*/
private $Hour_;
/**
* The text version of the minues
*
* @var String
*/
private $Minute_;
/**
* The text version of the meridiem
*
* @var String
*/
private $Meridiem_;
/**
* Display the meridiem text or not.
*
* @var Boolean
*/
private $DisplayMeridiem_;
/**
* Determines if hours or minutes needs to be displayed first.
*
* @var unknown_type
*/
private $DisplayHourFirst_ = true;
/**
* Array of number to text translations
*
* @var Array
*/
private $NumberLiterals_ = array
(
1 => 'One',
2 => 'Two',
3 => 'Three',
4 => 'Four',
5 => 'Five',
6 => 'Six',
7 => 'Seven',
8 => 'Eight',
9 => 'Nine',
10 => 'Ten',
11 => 'Eleven',
12 => 'Twelve',
13 => 'Thirteen',
14 => 'Fourteen',
15 => 'Fifteen',
16 => 'Sixteen',
17 => 'Seventeen',
18 => 'Eighteen',
19 => 'Nineteen',
20 => 'Twenty',
30 => 'Thirty',
40 => 'Fourty',
50 => 'Fifty',
);
public function __construct($TimeStamp = null, $DisplayMeridiem = true)
{
$DateTime = (is_null($TimeStamp) || empty($TimeStamp)) ? date('h:i:a') : date('h:i:a', $TimeStamp);
list($Hour, $Minute, $Meridiem) = split(':', $DateTime);
$this->GetTimeText_($Hour, $Minute, $Meridiem);
$this->DisplayMeridiem_ = $DisplayMeridiem;
}
/**
* Displays the time in a text format
*
* @param Integer $TimeStamp
* @return String
*/
public function Time($TimeStamp = null)
{
if (!is_null($TimeStamp))
$this->__construct($TimeStamp);
if ($this->Minute_)
{
if ($this->DisplayHourFirst_ == true)
{
$Time = $this->Hour_ . ' ' . $this->Minute_;
}
else
{
if ($this->Minute_ == self::QUARTER_TO || $this->Minute_ == self::QUARTER_AFTER)
$Time = $this->Minute_ . ' ' . $this->Hour_;
else
$Time = $this->Minute_ . ' after ' . $this->Hour_;
}
}
else
$Time = $this->Hour_;
if ($this->DisplayMeridiem_ == true)
$Time .= ' ' . $this->Meridiem_;
return $Time . '.';
}
/**
* Assembles the time into text format
*
* @param Mixed $Hour
* @param Mixed $Minute
* @param String $Meridiem
* @return String
*/
private function GetTimeText_($Hour, $Minute, $Meridiem)
{
$this->GetHourText_($Hour, $Minute, $Meridiem);
if ($Hour == 12 && ($Minute == 15 || $Minute == 45))
$this->GetMinuteText_($Hour, $Minute, $Meridiem);
else
{
$this->GetMinuteText_($Hour, $Minute, $Meridiem);
$this->GetMeridiemText_($Hour, $Minute, $Meridiem);
}
}
/**
* Converts the number value of the hour into its text verion
*
* @param Mixed $Hour
* @param Mixed $Minute
* @param String $Meridiem
* @return String
*/
private function GetHourText_($Hour, $Minute, $Meridiem)
{
// Set time to next meridiem if hour is past 12.
if ($Hour > 12)
{
$Hour = 1;
$Meridiem = $Meridiem == 'am' ? 'pm' : 'am';
}
if ($Hour == 12 && ($Minute == '00' || $Minute == 15 || $Minute == 45))
{
if ($Meridiem == 'am')
$this->Hour_ = self::MIDNIGHT;
else
$this->Hour_ = self::NOON;
}
else
$this->Hour_ = $this->NumToStr_($Hour);
}
/**
* Converts the number value of the meridiem into its text verion
*
* @param Mixed $Minute
*/
private function GetMinuteText_($Hour, $Minute, $Meridiem)
{
if ($Minute > 0)
{
switch ($Minute)
{
case 15:
$this->Minute_ = self::QUARTER_AFTER;
$this->DisplayHourFirst_ = false;
break;
// Move ahead to the next hour to display quarter to.
case 45:
$this->GetHourText_($Hour + 1, $Minute, $Meridiem);
$this->Minute_ = self::QUARTER_TO;
$this->GetMeridiemText_($Hour, $Minute, $Meridiem);
$this->DisplayHourFirst_ = false;
break;
default:
if ($Minute < 10)
$this->DisplayHourFirst_ = false;
$this->Minute_ = $this->NumToStr_($Minute);
break;
}
}
}
/**
* Converts the number value of the meridiem into its text verion
*
* @param Mixed $Hour
* @param Mixed $Minute
* @param String $Meridiem
*/
private function GetMeridiemText_($Hour, $Minute, $Meridiem)
{
if ($Meridiem == 'am')
$this->Meridiem_ = self::IN_THE_MORNING;
else
{
if ($Hour < 6) // According to Wikipedia, afternoon is before 6;
$this->Meridiem_ = self::IN_THE_AFTERNOON;
elseif ($Hour < 9) // According to Wikipedia, evening is before 9;
$this->Meridiem_ = self::IN_THE_EVENING;
else
$this->Meridiem_ = self::AT_NIGHT;
}
}
/**
* Converts a number to a text value
*
* @param Integer $Number
* @return String
*/
private function NumToStr_($Number)
{
if ($Number > 20)
{
if ($Number[1] > 0)
return $this->NumberLiterals_[str_pad($Number[0], 2, '0')] . '-' . $this->NumberLiterals_[$Number[1]];
else
return $this->NumberLiterals_[str_pad($Number[0], 2, '0')];
}
else
return $this->NumberLiterals_[ltrim($Number, '0')];
}
}
?>
|