这是我用来获取日期的代码(西班牙语):
$fecha = strftime("%d de %B, %Y, a las %l:%M %p");
我得到:
27 de julio, 2011, a las 7:10
所以问题是,我的 PM(或 AM)在哪里?
我的应用程序在 Linux 上运行。
好吧,php手册说
您的 C 库可能不支持所有转换说明符,在这种情况下,PHP 的 strftime() 将不支持它们。此外,并非所有平台都支持负时间戳,因此您的日期
这可能是你的问题。在这种情况下,您可以执行以下操作来获取 AM/PM:
$time = time();
$fecha = strftime("%d de %B, %Y, a las %l:%M ", $time).(($time%86400) < 43200 ? 'AM' : 'PM');
编辑:
这个答案假设您需要一个 UTC 时间字符串(如果您想要另一个时区,如果您将它存储或发送到任何地方,您还应该在字符串中包含时区),并且您的 php.ini 已date.timezone
设置为UTC
. 如果您不使用 UTC,则应计算偏移量。请参阅@Soylent17 的回答。
这个问题很老,但如果其他人需要它,它也发生在我身上。
似乎西班牙语语言环境没有实现 %p,因此请确保您的行位于将语言环境设置为西班牙语的行之前。可能您需要像这样对代码进行分解。
$hora = strftime(" a las %l:%M %p");
$loc_sp = setlocale (LC_TIME,'es_ES');
$fecha = strftime("%d de %B, %Y");
echo $fecha.$hora;
我没有足够的代表来为 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');
你在 OSX 上吗?如果支持%p
或%P
不支持
您可以尝试在 上使用另一个值setlocale()
,因为es_MX
不适合我但es_CO
可以完成工作,它支持%p
and %P
,这取决于服务器配置:v
可能的值列表
感谢@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...
我的解决方案
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;
}
确保语言环境拼写正确。对我来说, en_US.utf8 工作得很好, en_US 根本没有工作。尝试通过调用检查 unix 机器上已安装的语言环境
locale -a
在命令提示符下。
当我想出如何解决它时,我正在这里寻找我的问题的答案。
这是我的默认语言设置。
// Set Default Timezone
date_default_timezone_set('America/Bogota');
// Set Date Language -> Unix
setlocale(LC_TIME, 'es_ES.UTF-8');
// Set Date Language -> Windows
setlocale(LC_TIME, 'spanish');
然后,我试图用 AM 和 PM 显示当前日期,但它不起作用。
echo strftime("%d de %b de %Y, %H:%M %p", strtotime($sqlDate);
由于 %p 参数,这显示了一个空字段。当我阅读 AgelessEssence 的评论时,我开始在这些选项之间切换:
他们都没有工作,而我想我把这个字段留空并保存。
// Set Date Language -> Windows
setlocale(LC_TIME, '');
然后,它就像一个魅力。
$formato = "%A, %e de %B de %Y, %I:%M:%S %p";
// Comprobación para Windows para hallar y remplazar el
// modificador %e adecuadamente
if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') {
$formato = preg_replace('#(?<!%)((?:%%)*)%e#', '\1%#d', $formato);
}
$formato = preg_replace('#(?<!%)((?:%%)*)%p#', '\1#p', $formato);
$x = @strftime($formato);
$y = date('A');
$x = str_replace('#p', $y, $x);
简单丑陋
$date="2016-11-15 12:34";
$fecha=strftime("%A, %d de %B de %Y %l:%M", strtotime("$date")).date(' a', strtotime("$date"));
结果:martes,2016 年 11 月 15 日下午 12:34