TimeHelper
in package
Comprehensive time and timezone utility with formatting, comparison, and conversion capabilities
Static utility class providing extensive time manipulation, timezone conversion, duration formatting, and relative time calculation functionality. Handles microsecond-precision timestamps, ISO 8601 formatting, timezone comparisons, and human-readable time descriptions for international applications and precise time tracking.
Core Capabilities
- ISO 8601 Formatting: Precise timestamp formatting with microsecond support
- Timezone Operations: Conversion, comparison, and offset calculations
- Duration Formatting: Human-readable elapsed time and duration strings
- Relative Time: "Time ago" and "time until" descriptions
- Localization: Local timezone formatting and system integration
- Precision Timing: Microsecond-accurate timestamp handling
Timestamp Precision
All methods support microsecond-precision floating-point timestamps from microtime(true) and handle both integer Unix timestamps and fractional seconds for high-precision timing applications like performance monitoring and API benchmarking.
Timezone Support
Comprehensive timezone handling with:
- Daylight Saving Time (DST) detection
- UTC offset calculations in seconds and hours
- Regional timezone listing and validation
- Cross-timezone time comparison and conversion
- Local system timezone integration
Error Handling Philosophy
Methods use graceful error handling returning null or "Invalid timestamp" strings rather than throwing exceptions, making the class safe for use in logging and display contexts where exceptions could disrupt application flow.
Integration Points
- Timer Class: Provides timing utilities via TimeHelper::now() and elapsedDescription()
- Token Class: ISO formatting via TimeHelper::iso() for token expiration
- Logging Systems: Timestamp formatting for audit trails and debugging
- API Responses: Standardized time formatting for client consumption
Tags
Table of Contents
Methods
- compareLocalTo() : array<string|int, mixed>|null
- Compare local system timezone to target timezone
- compareLocalToJson() : string
- Get local to target timezone comparison as formatted JSON string
- compareTimezones() : array<string|int, mixed>|null
- Compare two timezones and return comprehensive difference analysis
- currentOffset() : int|null
- Get current UTC offset for timezone in seconds
- describeTimezone() : array<string|int, mixed>|null
- Get comprehensive information about specific timezone
- elapsedDescription() : string
- Format elapsed time between timestamps as human-readable duration string
- formatCompare() : string
- Format timezone comparison data into human-readable display string
- isDst() : bool|null
- Check if timezone is currently observing Daylight Saving Time
- iso() : string
- Convert timestamp to ISO 8601 format with microsecond precision and timezone control
- isValidTimezone() : bool
- Validate timezone identifier against PHP's timezone database
- listTimezones() : array<string|int, string>
- Get list of timezone identifiers with optional regional filtering
- localTimezone() : string
- Get system's default timezone identifier
- now() : float
- Get current timestamp with microsecond precision
- nowIso() : string
- Get current timestamp formatted as ISO 8601 string
- parseIso() : float|null
- Parse ISO 8601 date string and convert to floating-point timestamp
- printCompare() : void
- Output formatted timezone comparison directly to console
- relative() : string
- Generate relative time description automatically detecting past or future
- roundToNearestSecond() : int
- Round floating-point timestamp to nearest whole second
- secondsToDuration() : string
- Convert seconds into human-readable duration string with appropriate units
- timeAgo() : string
- Describe how long ago a timestamp occurred relative to reference point
- timestamp() : string
- Alias for iso() method providing convenient timestamp formatting
- timestampToLocalString() : string
- Convert timestamp to human-readable local time string with optional date inclusion
- timeUntil() : string
- Describe how far into the future a timestamp is from reference point
- timezoneOffset() : int
- Calculate hour difference between two timezones at specific point in time
- toLocal() : string
- Alias for timestampToLocalString() providing convenient local time formatting
- utcOffsetHours() : float|null
- Get timezone's current UTC offset in hours as floating-point number
Methods
compareLocalTo()
Compare local system timezone to target timezone
public
static compareLocalTo(string $targetTz) : array<string|int, mixed>|null
Convenience method that compares the system's default timezone (from date_default_timezone_get()) to specified target timezone. Simplifies common use case of comparing user's local time to specific timezone.
Local Timezone Source
Uses PHP's date_default_timezone_get() to determine local timezone, which can be set via date_default_timezone_set() or php.ini configuration.
Parameters
- $targetTz : string
-
Target timezone to compare against local
Tags
Return values
array<string|int, mixed>|null —Timezone comparison data, or null if target timezone invalid
compareLocalToJson()
Get local to target timezone comparison as formatted JSON string
public
static compareLocalToJson(string $targetTz) : string
Combines compareLocalTo() functionality with JSON formatting for API responses, configuration files, or debugging output. Provides pretty-printed JSON for improved readability.
Parameters
- $targetTz : string
-
Target timezone to compare against local
Tags
Return values
string —Pretty-printed JSON comparison data
compareTimezones()
Compare two timezones and return comprehensive difference analysis
public
static compareTimezones(string $fromTz, string $toTz) : array<string|int, mixed>|null
Provides detailed comparison between two timezones including local times, UTC offsets, abbreviations, and hour difference. Essential for scheduling applications and cross-timezone coordination.
Returned Comparison Structure
- from: Source timezone information (timezone, local_time, utc_offset, abbreviation)
- to: Target timezone information (same structure as 'from')
- difference_hours: Numeric hour difference (positive = target ahead)
Difference Calculation
- Positive difference: Target timezone ahead of source
- Negative difference: Target timezone behind source
- Zero difference: Timezones currently have same offset
Parameters
- $fromTz : string
-
Source timezone identifier
- $toTz : string
-
Target timezone identifier
Tags
Return values
array<string|int, mixed>|null —Comprehensive timezone comparison, or null if either timezone invalid
currentOffset()
Get current UTC offset for timezone in seconds
public
static currentOffset(string $tz) : int|null
Calculates the current UTC offset for specified timezone, accounting for Daylight Saving Time and regional time variations. Returns offset in seconds for precise time calculations and conversions.
Offset Calculation
- Positive values: Timezone ahead of UTC (e.g., +3600 for UTC+1)
- Negative values: Timezone behind UTC (e.g., -18000 for UTC-5)
- Zero: UTC timezone
- null: Invalid timezone
DST Awareness
Automatically accounts for Daylight Saving Time when calculating offset, providing accurate offset for current date and time.
Parameters
- $tz : string
-
Valid timezone identifier
Tags
Return values
int|null —UTC offset in seconds, or null if timezone invalid
describeTimezone()
Get comprehensive information about specific timezone
public
static describeTimezone(string $tz) : array<string|int, mixed>|null
Returns detailed timezone metadata including current local time, UTC offset, DST status, and timezone abbreviation. Provides complete timezone context for display and calculation purposes.
Returned Information Structure
- name: Timezone identifier (e.g., 'America/New_York')
- local_time: Current time in timezone (Y-m-d H:i:s format)
- utc_offset: Hours offset from UTC (float, can be negative)
- is_dst: Boolean indicating current DST status
- abbreviation: Timezone abbreviation (e.g., 'EST', 'PST')
Error Handling
Returns null for invalid timezone identifiers rather than throwing exceptions, enabling safe use in validation and display contexts.
Parameters
- $tz : string
-
Valid timezone identifier
Tags
Return values
array<string|int, mixed>|null —Associative array of timezone information, or null if invalid
elapsedDescription()
Format elapsed time between timestamps as human-readable duration string
public
static elapsedDescription(float $start[, float|null $end = null ][, int $precision = 2 ]) : string
Calculates time difference and formats into intuitive duration descriptions with appropriate units (milliseconds, seconds, minutes, hours). Automatically selects most appropriate unit and precision for optimal readability.
Format Selection Logic
- < 1 second: "123.45 ms" (milliseconds with precision)
- < 1 minute: "12.34 sec" (seconds with precision)
- < 1 hour: "5m 23.45s" (minutes and seconds)
- ≥ 1 hour: "2h 15m" (hours and minutes only)
Precision Control
Precision parameter controls decimal places in final unit display, providing flexibility for different contexts from debugging (high precision) to user display (low precision).
Parameters
- $start : float
-
Start timestamp (usually from microtime(true))
- $end : float|null = null
-
End timestamp (default: current time)
- $precision : int = 2
-
Decimal places for time display (default: 2)
Tags
Return values
string —Human-readable elapsed time description
formatCompare()
Format timezone comparison data into human-readable display string
public
static formatCompare(array<string|int, mixed> $data) : string
Transforms timezone comparison array into formatted multi-line string with visual separators and clear information hierarchy. Ideal for console output, reports, or debugging displays.
Format Structure
- Header with timezone names and arrow indicator
- Separator line for visual clarity
- From timezone: time, abbreviation, UTC offset
- To timezone: time, abbreviation, UTC offset
- Separator line
- Summary with hour difference
Error Handling
Returns "Invalid comparison data." for malformed or missing comparison data.
Parameters
- $data : array<string|int, mixed>
-
Timezone comparison data from compareTimezones()
Tags
Return values
string —Formatted multi-line comparison display
isDst()
Check if timezone is currently observing Daylight Saving Time
public
static isDst(string $tz) : bool|null
Determines DST status for specified timezone by examining current date and timezone rules. Essential for applications dealing with time-sensitive operations across regions with different DST observance patterns.
DST Detection Method
Uses DateTime::format('I') which returns 1 during DST periods and 0 otherwise. Checks current system time against timezone's DST rules.
Return Values
- true: Timezone currently observing DST
- false: Timezone not observing DST (standard time)
- null: Invalid timezone or detection failure
Parameters
- $tz : string
-
Valid timezone identifier (e.g., 'America/New_York')
Tags
Return values
bool|null —DST status or null if timezone invalid
iso()
Convert timestamp to ISO 8601 format with microsecond precision and timezone control
public
static iso(float $ts[, bool $utc = true ]) : string
Formats floating-point timestamps into standardized ISO 8601 strings with optional UTC or local timezone representation. Handles microsecond precision and provides consistent international timestamp formatting for APIs, logging, and data exchange.
ISO 8601 Format Features
- Microsecond precision: Preserves fractional seconds up to microseconds
- Timezone flexibility: UTC (Z suffix) or local timezone (+/-offset)
- Standards compliance: Full ISO 8601 specification adherence
- Error handling: Returns "Invalid timestamp" for malformed input
Output Format Examples
- UTC: "2025-01-15T14:30:00.123Z"
- Local: "2025-01-15T09:30:00.123-05:00"
- Error: "Invalid timestamp"
Precision Handling
Extracts microseconds from floating-point timestamps and incorporates them into the formatted string using DateTimeImmutable modification for accuracy.
Parameters
- $ts : float
-
Unix timestamp with microsecond precision (e.g., microtime(true))
- $utc : bool = true
-
Whether to format in UTC (true) or local timezone (false)
Tags
Return values
string —ISO 8601 formatted timestamp or "Invalid timestamp" on error
isValidTimezone()
Validate timezone identifier against PHP's timezone database
public
static isValidTimezone(string $tz) : bool
Checks if provided string is valid timezone identifier recognized by PHP's DateTimeZone class. Essential for user input validation and configuration verification before timezone operations.
Validation Method
Uses DateTimeZone::listIdentifiers() to get authoritative list of valid timezone identifiers and performs exact string matching.
Parameters
- $tz : string
-
Timezone identifier to validate
Tags
Return values
bool —True if timezone is valid, false otherwise
listTimezones()
Get list of timezone identifiers with optional regional filtering
public
static listTimezones([string|null $region = null ]) : array<string|int, string>
Returns array of valid timezone identifiers from PHP's timezone database, with optional filtering by geographic region. Essential for timezone selection interfaces and validation systems.
Regional Filtering Options
- 'AFRICA': African timezones (Africa/Cairo, etc.)
- 'AMERICA': American timezones (America/New_York, etc.)
- 'ASIA': Asian timezones (Asia/Tokyo, etc.)
- 'EUROPE': European timezones (Europe/London, etc.)
- 'AUSTRALIA': Australian timezones
- 'PACIFIC': Pacific region timezones
- 'UTC': UTC and related timezones
- null or 'ALL': All available timezones
Case Insensitivity
Region parameter is case-insensitive ('europe', 'EUROPE', 'Europe' all work).
Parameters
- $region : string|null = null
-
Optional region filter (case-insensitive)
Tags
Return values
array<string|int, string> —Array of timezone identifier strings
localTimezone()
Get system's default timezone identifier
public
static localTimezone() : string
Returns the currently configured default timezone for the PHP system. Wrapper around date_default_timezone_get() providing consistent interface for accessing system timezone configuration.
Timezone Source
Returns timezone set by:
- date_default_timezone_set() function calls
- date.timezone php.ini directive
- System timezone detection (if available)
- UTC fallback (if no timezone configured)
Tags
Return values
string —Current system default timezone identifier
now()
Get current timestamp with microsecond precision
public
static now() : float
Returns current Unix timestamp as floating-point number including microseconds for high-precision timing operations. Wrapper around microtime(true) providing consistent interface for current time access throughout TimeHelper methods.
Precision Details
- Integer part: Unix timestamp in seconds since epoch
- Fractional part: Microseconds (6 decimal places)
- Example: 1705334400.123456 represents precise moment in time
Use Cases
- Performance timing and benchmarking
- High-precision timestamp generation
- Timer implementations
- Duration calculations requiring microsecond accuracy
Tags
Return values
float —Current Unix timestamp with microsecond precision
nowIso()
Get current timestamp formatted as ISO 8601 string
public
static nowIso([bool $utc = true ]) : string
Convenience method that combines current time retrieval with ISO formatting, providing immediate access to properly formatted current timestamps for logging, API responses, and data recording.
Current Time Sources
Uses microtime(true) internally to capture current time with microsecond precision, then formats using iso() method for consistent output.
Parameters
- $utc : bool = true
-
Whether to format in UTC (true) or local timezone (false)
Tags
Return values
string —Current time as ISO 8601 formatted string
parseIso()
Parse ISO 8601 date string and convert to floating-point timestamp
public
static parseIso(string $iso) : float|null
Converts ISO 8601 formatted date strings back into Unix timestamps with microsecond precision. Handles various ISO 8601 formats including timezone indicators and provides robust parsing for API data and stored timestamps.
Supported ISO Formats
- Basic: "2025-01-15T14:30:00"
- With timezone: "2025-01-15T14:30:00Z"
- With offset: "2025-01-15T14:30:00+05:00"
- With microseconds: "2025-01-15T14:30:00.123456Z"
Error Handling
Returns null for invalid date strings rather than throwing exceptions, making it safe for use in validation and data processing contexts.
Parameters
- $iso : string
-
ISO 8601 formatted date string
Tags
Return values
float|null —Unix timestamp with microseconds, or null if parsing fails
printCompare()
Output formatted timezone comparison directly to console
public
static printCompare(string $fromTz, string $toTz) : void
Convenience method that combines compareTimezones() and formatCompare() to provide immediate formatted output for debugging and console applications. Eliminates need for intermediate variables in simple display scenarios.
Parameters
- $fromTz : string
-
Source timezone identifier
- $toTz : string
-
Target timezone identifier
Tags
Return values
void —Outputs formatted comparison directly via echo
relative()
Generate relative time description automatically detecting past or future
public
static relative(float $ts[, float|null $reference = null ]) : string
Intelligent relative time formatter that automatically determines whether timestamp is in past or future and applies appropriate description format. Combines timeAgo() and timeUntil() functionality with "now" detection for comprehensive relative time handling.
Automatic Direction Detection
- Past timestamps: Uses timeAgo() format ("X ago")
- Future timestamps: Uses timeUntil() format ("in X")
- Current time: Returns "now" for timestamps within 0.5 seconds
Precision Threshold
Timestamps within 0.5 seconds of reference point are considered "now" to handle minor timing variations and provide stable user experience.
Parameters
- $ts : float
-
Timestamp to describe (past, present, or future)
- $reference : float|null = null
-
Reference point (default: current time)
Tags
Return values
string —Automatic relative time description
roundToNearestSecond()
Round floating-point timestamp to nearest whole second
public
static roundToNearestSecond(float $ts) : int
Converts microsecond-precision timestamps to integer seconds using standard rounding rules. Useful for reducing precision when exact microsecond timing is not required or for compatibility with systems expecting integer timestamps.
Rounding Behavior
- 0.4 seconds: Rounds down to 0
- 0.5 seconds: Rounds up to 1
- 0.6 seconds: Rounds up to 1
- Uses PHP's round() function for consistent behavior
Parameters
- $ts : float
-
Floating-point timestamp with microseconds
Tags
Return values
int —Integer timestamp rounded to nearest second
secondsToDuration()
Convert seconds into human-readable duration string with appropriate units
public
static secondsToDuration(float|int $seconds) : string
Transforms numeric seconds into intuitive duration descriptions using hours, minutes, and seconds notation. Automatically selects relevant units and ensures at least one unit is always displayed for clarity.
Duration Format Logic
- Hours: Included if ≥ 3600 seconds (1 hour)
- Minutes: Included if ≥ 60 seconds (1 minute)
- Seconds: Always included unless zero and other units present
- Zero duration: Shows "0s" rather than empty string
Output Examples
- 3665 seconds: "1h 1m 5s"
- 125 seconds: "2m 5s"
- 45 seconds: "45s"
- 0 seconds: "0s"
Parameters
- $seconds : float|int
-
Duration in seconds (fractional seconds truncated)
Tags
Return values
string —Human-readable duration string
timeAgo()
Describe how long ago a timestamp occurred relative to reference point
public
static timeAgo(float $ts[, float|null $reference = null ]) : string
Generates human-readable "time ago" descriptions for past timestamps relative to current time or specified reference point. Automatically selects appropriate time unit for optimal readability and user understanding.
Time Unit Selection
- < 1 second: "just now"
- < 1 minute: "X seconds ago"
- < 1 hour: "X minutes ago"
- < 1 day: "X hours ago"
- ≥ 1 day: "X days ago"
Reference Point Flexibility
Allows custom reference timestamp for "ago" calculations, enabling relative time descriptions from any point in time rather than just current moment.
Parameters
- $ts : float
-
Timestamp to describe (must be in the past)
- $reference : float|null = null
-
Reference point (default: current time)
Tags
Return values
string —Human-readable "time ago" description
timestamp()
Alias for iso() method providing convenient timestamp formatting
public
static timestamp(float $ts[, bool $utc = true ]) : string
Convenience method that delegates to iso() for consistent ISO 8601 timestamp formatting. Maintains same functionality and parameters as iso() while providing more intuitive method naming for timestamp formatting operations.
Parameters
- $ts : float
-
Unix timestamp with microsecond precision
- $utc : bool = true
-
Whether to format in UTC (true) or local timezone (false)
Tags
Return values
string —ISO 8601 formatted timestamp or "Invalid timestamp" on error
timestampToLocalString()
Convert timestamp to human-readable local time string with optional date inclusion
public
static timestampToLocalString(float $ts[, bool $includeDate = true ]) : string
Formats timestamps into user-friendly local time representations using 12-hour format with AM/PM indicators. Provides flexible date inclusion for different display contexts and maintains microsecond precision in calculations.
Output Formats
- With date: "2025-01-15 9:30:00 AM"
- Time only: "9:30:00 AM"
- Error: "Invalid timestamp"
Localization Features
- Uses system default timezone via date_default_timezone_get()
- 12-hour format with AM/PM for user familiarity
- Microsecond precision preserved during conversion
- Graceful error handling for invalid timestamps
Use Cases
- User interface time display
- Log file human-readable timestamps
- Dashboard and report time formatting
- Email and notification timestamps
Parameters
- $ts : float
-
Unix timestamp with microsecond precision
- $includeDate : bool = true
-
Whether to include date portion (default: true)
Tags
Return values
string —Human-readable local time string or "Invalid timestamp" on error
timeUntil()
Describe how far into the future a timestamp is from reference point
public
static timeUntil(float $ts[, float|null $reference = null ]) : string
Generates human-readable "time until" descriptions for future timestamps relative to current time or specified reference point. Complements timeAgo() for comprehensive relative time description capabilities.
Time Unit Selection
- < 1 second: "any moment now"
- < 1 minute: "in X seconds"
- < 1 hour: "in X minutes"
- < 1 day: "in X hours"
- ≥ 1 day: "in X days"
Future Time Applications
Ideal for countdowns, scheduled events, expiration times, and deadline notifications where users need intuitive future time understanding.
Parameters
- $ts : float
-
Future timestamp to describe
- $reference : float|null = null
-
Reference point (default: current time)
Tags
Return values
string —Human-readable "time until" description
timezoneOffset()
Calculate hour difference between two timezones at specific point in time
public
static timezoneOffset(string $fromTz, string $toTz[, DateTimeInterface|null $at = null ]) : int
Computes timezone offset difference in hours, accounting for Daylight Saving Time rules at the specified date and time. Essential for accurate cross-timezone calculations and scheduling applications.
Offset Calculation
- Positive result: Target timezone ahead of source timezone
- Negative result: Target timezone behind source timezone
- Zero result: Timezones have same offset
- DST awareness: Automatically accounts for DST rules
Temporal Accuracy
Uses specific DateTime for calculation, ensuring accurate results even when DST transition dates differ between timezones or when calculating historical or future offsets.
Parameters
- $fromTz : string
-
Source timezone identifier
- $toTz : string
-
Target timezone identifier
- $at : DateTimeInterface|null = null
-
Specific date/time for calculation (default: now)
Tags
Return values
int —Hour difference between timezones
toLocal()
Alias for timestampToLocalString() providing convenient local time formatting
public
static toLocal(float $ts[, bool $withDate = true ]) : string
Convenience method that delegates to timestampToLocalString() for human-readable local time display. Maintains same functionality while providing intuitive method naming for local time conversion operations.
Parameters
- $ts : float
-
Unix timestamp with microsecond precision
- $withDate : bool = true
-
Whether to include date portion (default: true)
Tags
Return values
string —Human-readable local time string or "Invalid timestamp" on error
utcOffsetHours()
Get timezone's current UTC offset in hours as floating-point number
public
static utcOffsetHours(string $tz) : float|null
Converts timezone's UTC offset from seconds to hours for more intuitive display and calculation. Handles fractional hour offsets and DST transitions automatically.
Offset Representation
- Positive values: Timezone ahead of UTC (e.g., 9.0 for UTC+9)
- Negative values: Timezone behind UTC (e.g., -5.0 for UTC-5)
- Fractional values: Timezones with 30/45 minute offsets (e.g., 5.5 for UTC+5:30)
- null: Invalid timezone identifier
Parameters
- $tz : string
-
Valid timezone identifier
Tags
Return values
float|null —UTC offset in hours, or null if timezone invalid