<?php
/**
* Date handling
*
* Handles all date operations.
*
* @package System
* @author Pierre Lannoy <https://pierre.lannoy.fr/>.
* @since 1.0.0
*/
namespace Vibes\System;
/**
* Define the date functionality.
*
* Handles all date operations.
*
* @package System
* @author Pierre Lannoy <https://pierre.lannoy.fr/>.
* @since 1.0.0
*/
class Date {
/**
* Converts an UTC date into the correct format.
*
* @param string $ts The UTC MySql datetime to be converted.
* @param string $tz Optional. The timezone.
* @param string $format Optional. The date format.
* @return string Formatted date relative to the given timezone.
* @since 1.0.0
*/
public static function get_date_from_mysql_utc( $ts, $tz = '', $format = '-' ) {
if ( '-' === $format ) {
$format = get_option( 'date_format' );
}
if ( '' !== $tz ) {
$datetime = new \DateTime( $ts, new \DateTimeZone( 'UTC' ) );
$datetime->setTimezone( new \DateTimeZone( $tz ) );
return date_i18n( $format, strtotime( $datetime->format( 'Y-m-d H:i:s' ) ) );
} else {
return date_i18n( $format, strtotime( get_date_from_gmt( $ts ) ) );
}
}
/**
* Get the difference between now and a date, in human readable style (like "8 minutes ago" or "currently").
*
* @param string $from The UTC MySql datetime from which the difference must be computed (as today).
* @return string Human readable time difference.
* @since 1.0.0
*/
public static function get_positive_time_diff_from_mysql_utc( $from ) {
if ( strtotime( $from ) < time() ) {
return sprintf( esc_html__( '%s ago', 'vibes' ), human_time_diff( strtotime( $from ) ) );
} else {
return esc_html__( 'currently', 'vibes' );
}
}
/**
* Get the difference between now and a date, in human readable style (like "8 minutes ago" or "in 19 seconds").
*
* @param string $from The UTC MySql datetime from which the difference must be computed (as today).
* @return string Human readable time difference.
* @since 1.0.0
*/
public static function get_time_diff_from_mysql_utc( $from ) {
if ( strtotime( $from ) < time() ) {
return sprintf( esc_html__( '%s ago', 'vibes' ), human_time_diff( strtotime( $from ) ) );
} else {
return sprintf( esc_html__( 'in %s', 'vibes' ), human_time_diff( strtotime( $from ) ) );
}
}
/**
* Verify if a date exists.
*
* @param string $date The date to check.
* @param string $format Optional. The format of the date.
* @return boolean True if the date exists, false otherwise.
* @since 1.0.0
*/
public static function is_date_exists( $date, $format = 'Y-m-d H:i:s' ) {
try {
$datetime = new \DateTime( $date );
return $date === $datetime->format( $format );
} catch ( \Throwable $e ) {
return false;
}
}
/**
* Converts a integer number of seconds into an array.
*
* @param integer $age The age in seconds.
* @param boolean $legend Optional. Add the legend.
* @param boolean $abbrev Optional. Legend is abbreviated.
* @return array Array of days, hours, minutes and seconds.
* @since 1.0.0
*/
public static function get_age_array_from_seconds( $age, $legend = false, $abbrev = false ) {
if ( $abbrev ) {
$intervals = [
[ 60, _x( 'sec', 'Unit abbreviation - Stands for "second".', 'vibes' ), _x( 'sec', 'Unit abbreviation - Stands for "second".', 'vibes' ) ],
[ 60, _x( 'min', 'Unit abbreviation - Stands for "minute".', 'vibes' ), _x( 'min', 'Unit abbreviation - Stands for "minute".', 'vibes' ) ],
[ 100000, _x( 'hr', 'Unit abbreviation - Stands for "hour".', 'vibes' ), _x( 'hr', 'Unit abbreviation - Stands for "hour".', 'vibes' ) ],
];
} else {
$intervals = [
[ 60, _n( 'second', 'seconds', 1, 'vibes' ), _n( 'second', 'seconds', 2, 'vibes' ) ],
[ 60, _n( 'minute', 'minutes', 1, 'vibes' ), _n( 'minute', 'minutes', 2, 'vibes' ) ],
[ 100000, _n( 'hour', 'hours', 1, 'vibes' ), _n( 'hour', 'hours', 2, 'vibes' ) ],
];
}
$value = [];
foreach ( $intervals as $interval ) {
$val = $age % $interval[0];
$age = round( ( $age - $val ) / $interval[0], 0 );
if ( ( $val > 0 && $legend ) || ( $val >= 0 && ! $legend ) ) {
$value[] = $val . ( $legend ? ' ' . $interval[ ( 1 === $val ? 1 : 2 ) ] : '' );
}
}
return array_reverse( $value );
}
}