PHP date()函数:不带前导零的分钟数

60

我想知道PHP的date()函数是否有一种格式化字母,可以打印没有前导零的分钟,或者我必须手动测试和删除前导零?


5
我可以翻译为:我能问一下为什么没有不带零的分钟吗? - Jackt
是的,请问...我也想听听那个答案... - Benjamin Eckstein
一个原因是:如果你将例如 date("Y,n,j,G,i,s", xxx) 的结果输出到 JavaScript,它会在08和09分钟和秒数上抛出八进制数字的警告。虽然可以通过传递引号来解决这个问题:date("'Y','n','j','G','i','09'", xxx)。 - Steve Horvath
1
abs(date('i'))没有像intval()一样的问题。 - aequalsb
15个回答

109

用法:

$minutes = intval(date('i'));

6
PHP行为疯狂!它将整数09视为八进制数字,因为有前导零-由于9不是有效的八进制数字,因此将被评估为0。但是它将字符串09视为十进制整数9。 意料之外的行为再见! :) - hek2mgl
10
жңҖеҘҪдҪҝз”Ё(int)date('i');иҖҢдёҚжҳҜintval()пјҢиҝҷж ·йҖҹеәҰеә”иҜҘжӣҙеҝ«гҖӮ - KoviNET
根据文档,这是预期的行为,因为intval的第二个参数是“base”,默认值为10。如果将基数明确定义为“0”或“8”,则PHP将处理输入作为八进制数字。 - Rulisp
@hek2mgl请看下面我的回答... abs( date( 'i' ) ) 不像 intval() 有相同的问题。 - aequalsb
echo +'05'; 的结果是打印值 5。所以 +$date->format("your-format") 将返回一个整数 :) - Eugen Mihailescu

20
对于包含更多信息而不仅仅是分钟的时间: ltrim() - 从字符串开头删除空格(或其他字符)
ltrim(date('i:s'), '0');

返回:

8:24

3
这在少于1分钟的时间上无法生效。例如:00:24将导致输出为:24。 - Ludo - Off the record
完美融入我的函数(..elseif ($duration <= 3599 && $duration > 59) {..) - Jasom Dotnet
这是一个不错的解决方案,但只是一个糟糕的例子,应该分别使用 ltrim(date('i'), 0)ltrim(date('s'), 0) :) - jave.web

8
根据PHP文档date()函数没有不带前导零的分钟占位符。
然而,您可以通过将具有前导零的日期乘以1(转换为整数)来获取该信息。
$minutesWithoutZero = 1* date( 'i' );

真的。只是在我学习 JavaScript 的时候养成了一些不好的老习惯。 - Luke Stevenson
因为 Lucanos 提供的方案较为新颖,我给予一点赞。不过考虑到其简单易懂且非hack性,最终我还是选择了Hippo的答案。;-P - Bojangles

7

我也尝试过寻找这个方法,但没能成功。最终我决定将结果转换为整数类型,具体做法如下:

echo (int)date("s");

那么将以快速高效的方式消除前导零。

4

看起来不是这样,但你可以做类似于...

echo date('g:') . ltrim(date('i'), '0');

或者,您可以使用(int)将第二个date()调用进行转换。


3

这也是有效的

$timestamp = time(); // Or Your timestamp. Skip passing $timestamp if you want current time
echo (int)date('i',$timestamp);

4
不需要在那里添加 time() - alex
2
@alex,我实际上是想展示他在哪里可以添加自己的时间戳。 - Starx
Alex是正确的... date('format_string')假定time()作为第二个参数。 - aequalsb

2

我刚刚完成了这一行的解决方案。

$min = intval(date('i',strtotime($date)));

使用ltrim方法可能会删除所有前导零。例如,如果是'00'分钟,这种情况下将删除所有零并给出空结果。


2

如果我需要 XXmXXs 的格式,我会使用这种格式:

//Trim leading 0's and the 'm' if no minutes
ltrim(ltrim(gmdate("i\ms\s", $seconds), '0'), 'm');

这将输出以下内容:
12m34s
1m23s
12s

1
太棒了!比@ScottA的解决方案更好。这是我的代码(包括小时)print ltrim(gmdate("H\hi\ms\s", $duration), '0mh'); - Jasom Dotnet

1
我的解决方案:
function seconds2string($seconds) {
        if ($seconds == 0) {
            return '-';
        }
        if ($seconds < 60) {
            return date('0:s', $seconds);
        }
        if ($seconds < 3600) {
            return ltrim(date('i:s', $seconds), 0);
        }
        return date('G:i:s', $seconds);
}

这将输出:
0 seconds:            -
10 seconds:        0:10
90 seconds:        1:30
301 seconds:       5:01
1804 seconds:     30:04
3601 seconds:   1:00:01

1
只需使用这个:

(int) date('i');

@KrzysztofJaniszewski 感谢您的回复。很抱歉,我的母语不是英语,所以我很难用英语解释某些事情。但我会尝试。(int)函数在PHP中本地运行,因此应该运行速度快。但我没有测试过。 - user3890355

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