С некоторыми настройками локали, %p
возвращает пустую строку. Я бы предпочел, чтобы в этих случаях он возвращал либо AM, либо PM, даже если это не соответствует языку.
Вариант использования — это календарь событий, в котором пользователь может переопределить значение по умолчанию и указать, что ему нужно 12 часов времени. Было бы намного проще сделать код, если бы в начале класса я мог обнаружить, %p
возвращает локализованную или пустую строку и определяет ее как AM или PM, если она пуста.
— РЕДАКТИРОВАТЬ —
<?php
setlocale(LC_TIME, 'ru_RU.UTF8');
print(strftime('%l:%M %p %Z', time()));
?>
Во многих регионах, таких как ru_RU
, %p
возвращает бесполезную пустую строку. Когда перевод для AM или PM не определен, я хочу определить его как AM или PM. Так же, как мой вопрос до указанного редактирования.
Первое, что приходит на ум, и это может быть скорее бандитским решением, но стоит проверить $dformat
за %p
РЕДАКТИРОВАННОЕ РЕШЕНИЕ
Если есть разные формы форматирования, как я собрал в комментариях, то, возможно, лучше будет на самом деле интерполировать ваш собственный% p, если% p отображает пустую строку, так что это решение может работать для вас:
$check_for_empty_string = false;
if (preg_match("@%p@", $dformat)) {
if (strftime('%p', $node->start) == '') {
// get 24 hours
$hour = strtotime('%H', $start);
if ($hour >= 12) {
// it's PM
$dformat = preg_replace("@%p@", $this->PM, $dformat);
} else {
$dformat = preg_replace("@%p@", $this->AM, $dformat);
}
}
}
$start = strftime($dformat, $node->start);
$search = array(
'/^12:00 ' . $this->AM . '/',
'/^00:00$/', '/^12:00 ' . $this->PM . '/',
'/^12:00$/'
);
$replace = array(
'12:00 ' . $this->getString('Midnight'),
'00:00 ' . $this->getString('Midnight'),
'12:00 ' . $this->getString('Noon'),
'12:00 ' . $this->getString('Noon')
);
$start = preg_replace($search, $replace, $start);
$event->setAttribute('start', $start);
private function TwelveHourHack($dformat, $ts) {
if($this->safeTwelve) {
return strftime($dformat, $ts);
}
$dformat = preg_replace('/%p/', date('A', $ts), $dformat);
return strftime($dformat, $ts);
}
Это то, что я наконец-то сделал. $ this-> safeTwelve — логическое значение при инициации класса, глядя на
strlen(strftime('%p', $now))