8

这是我用来获取日期的代码(西班牙语):

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

我得到:

27 de julio, 2011, a las 7:10

所以问题是,我的 PM(或 AM)在哪里?

我的应用程序在 Linux 上运行。

4

11 回答 11

7

好吧,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 的回答

于 2011-07-28T00:51:14.333 回答
6

这个问题很老,但如果其他人需要它,它也发生在我身上。

似乎西班牙语语言环境没有实现 %p,因此请确保您的行位于将语言环境设置为西班牙语的行之前。可能您需要像这样对代码进行分解。

 $hora = strftime(" a las %l:%M %p");
 $loc_sp = setlocale (LC_TIME,'es_ES');
 $fecha = strftime("%d de %B, %Y");
 echo $fecha.$hora;
于 2014-08-09T21:34:45.870 回答
3

我没有足够的代表来为 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');
于 2016-09-08T19:48:40.470 回答
2

你在 OSX 上吗?如果支持%p%P 不支持

于 2011-07-28T00:45:02.063 回答
2

您可以尝试在 上使用另一个值setlocale(),因为es_MX不适合我但es_CO可以完成工作,它支持%pand %P,这取决于服务器配置:v

可能的值列表

于 2016-01-28T00:49:19.287 回答
0

感谢@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...
于 2014-08-26T17:01:55.263 回答
0

我的解决方案

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;
}
于 2015-01-06T05:00:45.413 回答
0

确保语言环境拼写正确。对我来说, en_US.utf8 工作得很好, en_US 根本没有工作。尝试通过调用检查 unix 机器上已安装的语言环境

locale -a 

在命令提示符下。

于 2018-12-20T09:01:26.843 回答
0

当我想出如何解决它时,我正在这里寻找我的问题的答案。

这是我的默认语言设置。

// 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 的评论时,我开始在这些选项之间切换:

  • es_MX ~ 墨西哥
  • es_ES ~ 西班牙
  • es_RA ~ 阿根廷
  • es_CO ~ 哥伦比亚

他们都没有工作,而我想我把这个字段留空并保存。

 // Set Date Language -> Windows
    setlocale(LC_TIME, '');

然后,它就像一个魅力。

于 2020-01-28T14:51:29.427 回答
0
        $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);
于 2020-05-09T23:37:04.940 回答
0

简单丑陋

$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

于 2016-11-16T04:00:10.507 回答