PHP中的strptime()函数

1. 简介

在PHP中,有一个非常实用的函数 strptime(),它允许我们将时间字符串解析为日期和时间信息。这个函数的功能与C语言中的同名函数类似,可以帮助我们方便地操作时间信息。

2. strptime()函数的基本使用方法

strptime()函数的基本用法非常简单,只需要传入两个参数:要解析的时间字符串和时间字符串的格式。函数会将时间字符串解析为结构体,并返回解析后的日期和时间信息。

$time_str = '2019-10-01 15:30:00';

$time_format = '%Y-%m-%d %H:%M:%S';

$time_info = strptime($time_str, $time_format);

print_r($time_info);

上面的代码会输出类似下面这样的内容:

{ 

["tm_sec"]=> int(0)

["tm_min"]=> int(30)

["tm_hour"]=> int(15)

["tm_mday"]=> int(1)

["tm_mon"]=> int(9)

["tm_year"]=> int(119)

["tm_wday"]=> int(2)

["tm_yday"]=> int(273)

["tm_isdst"]=> int(-1)

}

在上面的输出结果中,我们可以看到一系列的tm_xxx字段,它们分别表示时间的各个部分,比如tm_hour表示小时数,tm_min表示分钟数,等等。

3. 时间字符串的格式化

3.1 基本格式化方式

strptime()函数第二个参数的意义非常重要,它指定了时间字符串的格式。具体来说,时间字符串中的各个部分需要用不同的格式符号进行表示,下面是一些常用的格式符号:

符号 含义
%a 星期几的缩写(如Mon)
%A 星期几的完整名称(如Monday)
%b 月份的缩写(如Jan)
%B 月份的完整名称(如January)
%d 日期(如01)
%H 小时(24小时制,如15)
%I 小时(12小时制,如03)
%m 月份(如10)
%M 分钟(如30)
%p 上午或下午(AM或PM)
%S 秒数(如01)
%y 年份的后两位(如19)
%Y 年份的完整表示(如2019)
%Z 时区缩写(如UTC)

这些格式符号可以组合使用,从而表示不同的时间格式。下面是一个示例:

$time_str = '2019-10-01 15:30:00';

$time_format = '%Y-%m-%d %H:%M:%S';

$time_info = strptime($time_str, $time_format);

echo "{$time_info['tm_mon']}-{$time_info['tm_mday']}-{$time_info['tm_year']+1900} {$time_info['tm_hour']}:{$time_info['tm_min']}:{$time_info['tm_sec']}";

输出结果为:

10-1-2019 15:30:0

3.2 其他格式化方式

除了上面介绍的基本格式化方式外,strptime()函数还支持一些其他的格式化方式。下面列举一些比较常用的方法。

3.2.1 相对日期和时间字符串

时间字符串中除了用具体的数字表示时间之外,还可以用相对的时间表示方式。比如我们可以用 "now" 表示当前时间:

$time_str = 'now';

$time_format = '%Y-%m-%d %H:%M:%S';

$time_info = strptime($time_str, $time_format);

echo "{$time_info['tm_mon']}-{$time_info['tm_mday']}-{$time_info['tm_year']+1900} {$time_info['tm_hour']}:{$time_info['tm_min']}:{$time_info['tm_sec']}";

输出结果为:

11-18-2021 0:0:0

我们还可以用 "tomorrow"(明天)、 "yesterday"(昨天)等相对时间表达式:

$time_str = 'tomorrow';

$time_format = '%Y-%m-%d %H:%M:%S';

$time_info = strptime($time_str, $time_format);

echo "{$time_info['tm_mon']}-{$time_info['tm_mday']}-{$time_info['tm_year']+1900} {$time_info['tm_hour']}:{$time_info['tm_min']}:{$time_info['tm_sec']}";

输出结果为:

11-19-2021 0:0:0

3.2.2 时间戳字符串

时间戳是指从1970年1月1日0时0分0秒以来的秒数。我们可以用PHP中的时间戳函数 time() ,将当前时间表示为时间戳:

$time_str = time();

$time_format = '%Y-%m-%d %H:%M:%S';

$time_info = strptime($time_str, $time_format);

echo "{$time_info['tm_mon']}-{$time_info['tm_mday']}-{$time_info['tm_year']+1900} {$time_info['tm_hour']}:{$time_info['tm_min']}:{$time_info['tm_sec']}";

输出结果为:

11-18-2021 13:34:51

我们也可以将一个时间戳转换成时间字符串:

$time_stamp = 1571322036;

$time_format = '%Y-%m-%d %H:%M:%S';

$time_info = strptime($time_stamp, $time_format);

echo "{$time_info['tm_mon']}-{$time_info['tm_mday']}-{$time_info['tm_year']+1900} {$time_info['tm_hour']}:{$time_info['tm_min']}:{$time_info['tm_sec']}";

输出结果为:

10-17-2019 09:27:16

4. 汉字日期和时间字符串的格式化

在实际应用中,我们经常会遇到一些汉字日期和时间字符串,例如"2021年11月18日"、"下午2点30分"等。对于这类字符串,我们需要使用一些特殊的格式化方式才能将其转换为时间信息。

4.1 汉字日期字符串的格式化

对于汉字日期字符串,我们可以使用PHP中的 strtotime() 函数将其转换成时间戳,然后再使用strptime()函数解析。下面是一个例子:

$time_str = '2021年11月18日';

$time_format = '%Y-%m-%d';

$time_stamp = strtotime($time_str);

$time_info = strptime($time_stamp, $time_format);

echo "{$time_info['tm_mon']}-{$time_info['tm_mday']}-{$time_info['tm_year']+1900}";

输出结果为:

11-18-2021

4.2 汉字时间字符串的格式化

对于汉字时间字符串,我们需要先将其转换成24小时制的时间字符串,然后再使用strptime()函数解析。下面是一个例子:

$time_str = '下午2点30分';

$time_format = '%H:%M:%S';

//将时间字符串转换成24小时制

$time_str = date('H:i:s', strtotime(str_replace('下午','pm',str_replace('上午','am', $time_str))));

$time_info = strptime($time_str, $time_format);

echo "{$time_info['tm_hour']}:{$time_info['tm_min']}:{$time_info['tm_sec']}";

输出结果为:

14:30:00

5. 总结

这篇文章介绍了strptime()函数的基本用法以及一些常见的时间字符串格式化方法。在实际开发中,我们常常需要处理各种时间字符串,使用strptime()函数可以帮助我们快速解析这些字符串。

后端开发标签