2011-07-28 3 views
5

Voici le code que j'utilise pour obtenir la date (en espagnol):strftime ne montre pas PM ou AM

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

et je reçois:

27 de julio, 2011, a las 7:10 

La question est, où est mon PM (ou AM)?

Mon application fonctionne sous Linux.

+0

Êtes-vous en cours d'exécution sur php un Mac? – Paulpro

+0

PHP sur GNU \ Linux. – Danny

Répondre

6

Eh bien ,, l'php manual dit

Tous les indicateurs de conversion peuvent être pris en charge par votre bibliothèque C, auquel cas ils ne seront pas pris en charge par strftime() de PHP. De plus, toutes les plates-formes ne prennent pas en charge les horodatages négatifs, donc votre date

Cela pourrait être votre problème. Dans ce cas, vous pouvez faire quelque chose comme ça pour obtenir AM/PM:

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

EDIT:

Cette réponse est en supposant que vous voulez une chaîne de temps UTC (si vous voulez un autre fuseau horaire, vous devriez incluez également le fuseau horaire dans la chaîne si vous le stockez ou l'envoyez n'importe où), et que votre php.ini a date.timezone mis à UTC. Si vous n'utilisez pas UTC, vous devez calculer un décalage. See @Soylent17's answer.

+1

Cela fonctionne, mais c'est l'inverse "PM": "AM". Merci. – Danny

+0

Non, en fait ce n'est pas, c'est 'AM': 'PM'. Je viens de tester. –

+0

@ThatBrazilianGuy Cela fonctionne dans certaines circonstances. Je pense qu'après minuit c'est quand ça devient foiré. – Danny

3

La question est ancienne, mais au cas où quelqu'un d'autre en aurait besoin, cela m'est également arrivé.

Il semble que les paramètres régionaux espagnols n'ont pas d'implémentation pour% p, alors assurez-vous que votre ligne est antérieure à la ligne définissant les paramètres régionaux en espagnol. Probablement, vous aurez besoin de fractionner votre code comme ça.

$hora = strftime(" a las %l:%M %p"); 
$loc_sp = setlocale (LC_TIME,'es_ES'); 
$fecha = strftime("%d de %B, %Y"); 
echo $fecha.$hora; 
+0

votre réponse a inspiré ma réponse, vérifiez-la! :RÉ – AgelessEssence

0

Merci à @iyepes, je résolus de contourner complètement la Locale si vous avez le site en plusieurs langues,% P ou% p sont à la fois sans valeur dans des endroits autres que ceux en anglais, je suppose, au moins c'est la cas pour l'espagnol

Séparez% P ou% p des paramètres régionaux, si vous disposez d'une boucle while, définissez la locale sur en_US, extrayez les heures dans en_US strftime, y compris% P, puis définissez les paramètres régionaux définis par l'utilisateur.

$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... 
0

ma solution

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; 
} 
1

vous pouvez essayer d'utiliser une autre valeur sur setlocale(), parce que es_MX ne fonctionnent pas pour moi, mais es_CO faire le travail, il supporte %p et %P, cela dépend du serveur configuration: v

valeurs possibles liste

3

Je n'ai pas assez représentant pour ajouter un commentaire à la réponse de PaulPro, donc je Je vais juste devoir m'étendre là-dessus. Lorsque vous travaillez directement avec l'horodatage, vous devez ajuster le décalage de votre fuseau horaire. Alors, où PaulPro mis $time%86400, vous avez besoin quelque chose comme ($time+date('Z'))%86400

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

simple et laid

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

résultats dans: martes, 15 de noviembre de 2016 12h34