$oneMatch) {
$format = str_replace(['year', 'month', 'weekday', 'day'], ['Y', 'm', 'N', 'd'], $results[1][$i]);
$delay = str_replace(['add', 'remove'], ['+', '-'], $results[2][$i]).intval($results[3][$i]).' '.str_replace('weekday', 'day', $results[1][$i]);
$value = str_replace($oneMatch, gmdate($format, strtotime($delay)), $value);
}
}
return $value;
}
function acym_dateField(string $name, $value = '', string $class = '', string $attributes = '', string $relativeDefault = '-'): string
{
// Open container
$result = '
';
// Input in which the value is
$id = 'acym_'.preg_replace('#[^a-z0-9_]#i', '', $name);
if (is_numeric($value)) {
$months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
$replaceValues = [];
foreach ($months as $oneMonth) {
$replaceValues[] = substr(acym_translation('ACYM_'.strtoupper($oneMonth)), 0, 3);
}
$shownValue = str_replace($months, $replaceValues, acym_date($value, 'd F Y H:i'));
} else {
$shownValue = $value;
}
$hiddenField = '';
}
$days = [
'' => acym_translation('ACYM_DAY'),
];
for ($i = 1; $i <= 31; $i++) {
$days[$i < 10 ? '0'.$i : $i] = $i < 10 ? '0'.$i : $i;
}
$month = [
'' => acym_translation('ACYM_MONTH'),
'01' => acym_translation('ACYM_JANUARY'),
'02' => acym_translation('ACYM_FEBRUARY'),
'03' => acym_translation('ACYM_MARCH'),
'04' => acym_translation('ACYM_APRIL'),
'05' => acym_translation('ACYM_MAY'),
'06' => acym_translation('ACYM_JUNE'),
'07' => acym_translation('ACYM_JULY'),
'08' => acym_translation('ACYM_AUGUST'),
'09' => acym_translation('ACYM_SEPTEMBER'),
'10' => acym_translation('ACYM_OCTOBER'),
'11' => acym_translation('ACYM_NOVEMBER'),
'12' => acym_translation('ACYM_DECEMBER'),
];
$year = [
'' => acym_translation('ACYM_YEAR'),
];
$currentYear = (int)acym_date('now', 'Y');
for ($i = 1900; $i <= $currentYear + 10; $i++) {
$year[$i] = $i;
}
$formatToDisplay = explode('%', $format);
$defaultDate = empty($default) ? [] : explode('-', $default);
unset($formatToDisplay[0]);
foreach ($formatToDisplay as $one) {
if ($one === 'd') {
if ($returnHtml) {
$return[] = '
'.acym_select(
$days,
$name,
empty($defaultDate[2]) || $defaultDate[2] === '00' ? '' : $defaultDate[2],
array_merge($attributes, ['aria-label' => acym_translation('ACYM_DAY')]),
'value',
'text',
$name.'-'.$one
).'
';
} elseif (!empty($defaultDate[2]) && $defaultDate[2] !== '00') {
$return[] = $defaultDate[2];
}
}
if ($one === 'm') {
if ($returnHtml) {
$return[] = '
'.acym_select(
$month,
$name,
empty($defaultDate[1]) || $defaultDate[1] === '00' ? '' : $defaultDate[1],
array_merge($attributes, ['aria-label' => acym_translation('ACYM_MONTH')]),
'value',
'text',
$name.'-'.$one
).'
';
} elseif (!empty($defaultDate[1]) && $defaultDate[1] !== '00') {
$return[] = $month[$defaultDate[1]];
}
}
if ($one === 'y') {
if ($returnHtml) {
$return[] = '
'.acym_select(
$year,
$name,
empty($defaultDate[0]) || $defaultDate[0] === '0000' ? '' : $defaultDate[0],
array_merge($attributes, ['aria-label' => acym_translation('ACYM_YEAR')]),
'value',
'text',
$name.'-'.$one
).'
';
} elseif (!empty($defaultDate[0]) && $defaultDate[0] !== '0000') {
$return[] = $defaultDate[0];
}
}
}
if ($returnHtml) {
$return[] = '
';
return implode('', $return);
} else {
return implode(' ', $return);
}
}
function acym_getTimeFromUTCDate(?string $date): int
{
// Accept null/empty inputs gracefully and return 0 when no valid date is provided to avoid error.
if (empty($date)) {
return 0;
}
// Stored dates are UTC: parse them as UTC so the resulting timestamp is independent of the server timezone
$timestamp = strtotime($date.' UTC');
if ($timestamp === false) {
$timestamp = strtotime($date);
}
if ($timestamp === false) {
return 0;
}
return $timestamp;
}
function acym_getTimeFromCMSDate($date)
{
return acym_getTimeFromUTCDate($date) - acym_getTimeOffsetCMS();
}
function acym_getTime($date)
{
return acym_getTimeFromCMSDate($date);
}
function acym_date($date = 'now', $format = null, bool $useTz = true, bool $translate = true): string
{
if ($date === 'now') {
$date = time();
}
if (is_numeric($date)) {
$date = acym_dateTimeCMS($date);
}
if (!$format || (strpos($format, 'ACYM_DATE_FORMAT') !== false && acym_translation($format) == $format)) {
$format = 'ACYM_DATE_FORMAT_LC1';
}
if (strpos($format, 'ACYM_DATE') !== false) {
$format = acym_translation($format);
}
//Don't use timezone
if ($useTz === false) {
$date = new DateTime($date);
if ($translate) {
return acym_translateDate($date->format($format));
} else {
return $date->format($format);
}
} else {
//We replace the . with : WordPress give format like UTC+5.45, but we want something like UTC+5:45
$cmsOffset = str_replace('.', ':', acym_getCMSConfig('offset'));
$timezone = new DateTimeZone($cmsOffset);
if (!is_numeric($cmsOffset)) {
$cmsOffset = $timezone->getOffset(new DateTime());
}
// $date is a UTC date string: apply the CMS timezone offset then format in UTC so the server timezone never shifts the displayed result
if ($translate) {
return acym_translateDate(gmdate($format, strtotime($date.' UTC') + $cmsOffset));
} else {
return gmdate($format, strtotime($date.' UTC') + $cmsOffset);
}
}
}
function acym_translateDate(string $date): string
{
$map = [
'January' => 'ACYM_JANUARY',
'February' => 'ACYM_FEBRUARY',
'March' => 'ACYM_MARCH',
'April' => 'ACYM_APRIL',
'May' => 'ACYM_MAY',
'June' => 'ACYM_JUNE',
'July' => 'ACYM_JULY',
'August' => 'ACYM_AUGUST',
'September' => 'ACYM_SEPTEMBER',
'October' => 'ACYM_OCTOBER',
'November' => 'ACYM_NOVEMBER',
'December' => 'ACYM_DECEMBER',
'Monday' => 'ACYM_MONDAY',
'Tuesday' => 'ACYM_TUESDAY',
'Wednesday' => 'ACYM_WEDNESDAY',
'Thursday' => 'ACYM_THURSDAY',
'Friday' => 'ACYM_FRIDAY',
'Saturday' => 'ACYM_SATURDAY',
'Sunday' => 'ACYM_SUNDAY',
];
foreach ($map as $english => $translationKey) {
$translation = acym_translation($translationKey);
if ($translation === $translationKey) {
continue;
}
$date = preg_replace('#'.preg_quote($english).'#i', $translation, $date);
$date = preg_replace('#'.preg_quote(substr($english, 0, 3)).'#i', mb_substr($translation, 0, 3), $date);
}
return $date;
}
function acym_isDateValid($date): bool
{
return $date !== '0000-00-00 00:00:00' && !empty($date);
}