尝试将PHP时间格式化为12小时制,没有前导零。

24

我感觉很愚蠢地问了一个问题 - 但是我在时间格式方面遇到了麻烦。我正在使用PHP从MySQL数据库中检索日期/时间,尝试格式化时间显示以便12小时制中没有前导零字符。只有空格就可以.. 听起来容易对吧?可能是...

我想要的样式是:6:00 PM 而不是 06:00 PM

$result [0] [0] 是值为"2013-06-06 18:00:00"的值

现在的PHP代码:

echo strftime('%I:%M %p', strtotime($result[0][0]));
//upper case "i" WORKS but has leading zero

我认为我需要的PHP代码是:

echo strftime('%l:%M %p', strtotime($result[0][0]));
//Lower case "L" Provides no output

原因是根据PHP手册,使用%l(小写的 'L')会产生12小时制格式的小时数,在数字为1到12的单个数字前加上空格。

但是当我使用这种格式时,什么也没有得到!

我做错了什么简单的事情?

(嗯,有趣的是,上面的代码在StackOverflow屏幕上看起来完全相同,但我输入的是大写字母'i'和小写字母'l'...实际上这里是大写字母'I'--> "I",这里是小写字母'L' --> "l" ??)它们在这种字体下看起来相同吗?


当然!谢谢。我显然太过于接近这个问题了。 :) 但是我仍然想知道为什么? - eaton9999
请问您能提供原始的 $result[0][0] 值吗? - BlitZ
是的 - 是:2013年6月6日18:00:00 - eaton9999
4个回答

48

DateTime能够起到作用:

<?php
header('Content-Type: text/plain');

$date = DateTime::createFromFormat('Y-m-d H:i:s', '2013-06-06 18:00:00');

echo $date->format('g:i A');
?>

此外,date()也可以实现:

<?php
header('Content-Type: text/plain');

echo date('g:i A', strtotime('2013-06-06 18:00:00'));
?>

两者都显示:

6:00 PM

strftime() 看起来有点问题。 %l 显示为空字符串。我尝试在顶部放置 setlocale(LC_TIME, "de_DE");,但没有帮助。

以下可能是原因(来自 文档):

并非所有的转换说明符都被您的 C 库支持,如果不支持,则它们将不受 PHP 的 strftime() 支持。此外,并非所有平台都支持负时间戳,因此您的日期范围可能限制为 Unix 纪元之后。这意味着 %e、%T、%R 和 %D(以及可能还有其他) - 以及 1970 年 1 月 1 日之前的日期 - 将无法在 Windows、一些 Linux 发行版和其他几个操作系统上工作。对于 Windows 系统,可以在 »MSDN 上找到支持的转换说明符的完整概述。

在MSDN上没有%l格式代码。这可能是导致返回值错误的原因。在这种情况下,strftime()函数是平台相关的。

同意可能是strftime()存在错误的问题。我将使用修剪选项,但了解这两个选项也很好。它们对我也适用,因为我刚刚测试过每一个。再次感谢。 - eaton9999
那么也许这表明了一种更好的格式化方法,例如 date() 函数,因为它似乎没有相同的记录平台和值约束和问题?我感到很受启发。 - eaton9999
我更喜欢使用date()版本。它更好,因为函数调用更少,并且更可靠,因为不依赖于平台。请使用它代替trim(strftime('%I:%M %p', strtotime($result[0][0])), '0') - BlitZ
是的 - 经过思考这两种方法,似乎更加直接和高效。再次做出正确的决定。 - eaton9999
我正在使用这个echo date('g:i:s',strtotime($total_time)); 但是如果小时为0,则它会显示12小时,如果小时大于零,则会显示正确的时间。请帮帮我。 - Nadeem Ijaz

5

根据您的代码,我还会尝试以下方法来去掉前导零:

在PHP中,"g" 会显示没有前导零的小时。

时间:<?= echo strftime("g:i:sa", strtotime($result['time'])); ?>


echo date('g:i A, strtotime($result['time']))); 是正确的 - 为什么要使用strftime? - Albuquerque Web Design

2

PHP日期时间对象可以不带前导零进行格式化,例如:

$DateTime->format('j');

1

嘿,你可以使用下面的函数从strftime中去掉任何前导零

       function strip_zeros_from_date( $marked_string="") {
        //remove the marked zero's 
        $no_zeros = str_replace('*0', '', $marked_string);
        //Remove Reaming
        $cleaned_string = str_replace('*', '', $no_zeros);
        return $cleaned_string;

        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接