strftime не показывает PM или AM - PullRequest
5 голосов
/ 28 июля 2011

Это код, который я использую, чтобы получить дату (на испанском языке):

$fecha = strftime("%d de %B, %Y, a las %l:%M %p");

, и я получаю:

27 de julio, 2011, a las 7:10

Итак, вопрос в том, где мой PM (или AM)?

Мое приложение работает в Linux.

Ответы [ 9 ]

7 голосов
/ 28 июля 2011

Ну, в php руководстве написано

Не все спецификаторы преобразования могут поддерживаться вашей библиотекой C, и в этом случае они не будут поддерживаться PHP-функцией strftime (). Кроме того, не все платформы поддерживают отрицательные временные метки, поэтому ваша дата

Это может быть вашей проблемой. В этом случае вы можете сделать что-то вроде этого, чтобы получить AM / PM:

$time = time();
$fecha = strftime("%d de %B, %Y, a las %l:%M ", $time).(($time%86400) < 43200 ? 'AM' : 'PM');

EDIT

В этом ответе предполагается, что вам нужна строка времени в формате UTC (если вам нужен другой часовой пояс, вы должны также включить часовой пояс в строку, если вы храните его или отправляете куда-либо), и что ваш php.ini имеет date.timezone установите на UTC. Если вы не используете UTC, вы должны вычислить смещение. См. Ответ @ Soylent17 .

3 голосов
/ 08 сентября 2016

Мне не хватает представителя, чтобы добавить комментарий к ответу PaulPro, поэтому мне просто нужно его расширить.При работе непосредственно с отметкой времени вам нужно будет настроить смещение часового пояса.Итак, где PaulPro поставил $time%86400, вам нужно что-то вроде ($time+date('Z'))%86400

$time = time();
$fecha = strftime("%d de %B, %Y, a las %l:%M ", $time).(($time+date('Z'))%86400 < 43200 ? 'AM' : 'PM');
3 голосов
/ 10 августа 2014

Вопрос старый, но в случае, если это нужно кому-то другому, это также случилось со мной.

Кажется, что в испанской локали нет реализации для% p, поэтому убедитесь, что ваша строка находится перед строкой, устанавливающей локаль на испанский. Возможно, вам нужно будет разделить ваш код следующим образом.

 $hora = strftime(" a las %l:%M %p");
 $loc_sp = setlocale (LC_TIME,'es_ES');
 $fecha = strftime("%d de %B, %Y");
 echo $fecha.$hora;
2 голосов
/ 28 июля 2011

Вы на OSX?Если это так, %p или %P не поддерживается

1 голос
/ 28 января 2016

вы можете попробовать использовать другое значение на setlocale(), потому что es_MX не работает для меня, но es_CO выполняет работу, он поддерживает %p и %P, это зависит от конфигурации сервера: v

список возможных значений

0 голосов
/ 20 декабря 2018

Убедитесь, что локаль написана правильно. Для меня en_US.utf8 работал нормально, en_US вообще не работал. Попробуйте проверить установленные локали на машинах Unix, позвонив по номеру

locale -a 

в командной строке.

0 голосов
/ 16 ноября 2016

просто и некрасиво

$date="2016-11-15 12:34";    
$fecha=strftime("%A, %d de %B de %Y %l:%M", strtotime("$date")).date(' a', strtotime("$date"));

Результаты: 15 марта 2016 г. 12:34

0 голосов
/ 06 января 2015

мое решение

function mystrftime($format, $time=null){
    if(!$time) $time = time();
    preg_match_all('/%[a-zA-Z]/', $format, $placeholders);
    foreach ($placeholders[0] as $placeholder){
        if(strftime($placeholder, $time)==''){
            $format = str_replace($placeholder, '%'.$placeholder, $format);
        }
    }   
    $format = strftime($format, $time);
    preg_match_all('/%[a-zA-Z]/', $format, $placeholders);
    $locale = setlocale('LC_TIME', '0');
    setlocale('LC_TIME', 'en_US.UTF8');
    foreach ($placeholders[0] as $placeholder){
        $format = str_replace($placeholder, strftime($placeholder, $time), $format);
    }   
    setlocale('LC_TIME', $locale);
    return $format;
}
0 голосов
/ 26 августа 2014

Благодаря @iyepes, я решил полностью обойти локаль, если у вас есть сайт на нескольких языках,% P или% p оба бесполезны в локалях, отличных от английских, я полагаю, по крайней мере, так обстоит дело с испанским

Отделите% P или% p от языкового стандарта. Если у вас есть цикл while, установите для языкового стандарта значение en_US, извлеките время в en_US strftime, включая% P, а затем установите обратно в языковой стандарт, определенный пользователем.

$day1 =  strtotime($row["day1"]);
$day2 = strtotime($row["day2"]);
$day3 = strtotime($row["day3"]);

  setlocale(LC_ALL, "en_US");

$time1 = strftime("%l:%M %P", $day1);
$time2 = strftime("%l:%M %P", $day2);
$time3 = strftime("%l:%M %P", $day3);

  setlocale(LC_ALL, $defined_locale);

$day1 - strftime("%d de %B, %Y, " $day1).$time1;
$day2 - strftime("%d de %B, %Y, " $day2).$time2;
etc...
...