示例

以下示例演示了strptime()和strftime(3)的用法。

#define _XOPEN_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

int
main(void)
{
    struct tm tm;
    char buf[255];

    memset(&tm, 0, sizeof(struct tm));
    strptime("2001-11-12 18:31:01", "%Y-%m-%d %H:%M:%S", &tm);
    strftime(buf, sizeof(buf), "%d %b %Y %H:%M", &tm);
    puts(buf);
    exit(EXIT_SUCCESS);
}

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/

返回值

该函数的返回值是指向此函数调用中未处理的第一个字符的指针。如果输入字符串包含的字符多于格式字符串所需的字符,则返回值指向最后使用的输入字符之后。如果整个输入字符串都被耗尽,则返回值指向字符串末尾的空字节。如果strptime()无法匹配所有格式字符串,因此发生错误,则该函数返回NULL。

遵循规范

POSIX.1-2001,POSIX.1-2008,SUSv2。

名称

strptime-将时间的字符串表示形式转换为时间tm结构

备注

原则上,此函数不初始化tm,而仅存储指定的值。这意味着应该在调用之前初始化tm。不同的UNIX系统之间的细节有些不同。 glibc实现不涉及那些未明确指定的字段,除非如果更改了年,月或日元素中的任何一个,它将重新计算tm_wday和tm_yday字段。

aqyaq(百年制)规范用于指定glibc 2.0在1950年至2049年之间的年份。自glibc 2.1以来,它被认为是1969-2068年。

Glibc notes

出于对称性原因,glibc尝试为strptime()支持与strftime(3)相同的格式字符。 (在大多数情况下,将解析相应的字段,但不会更改tm中的任何字段。)这导致

%F
等效于ISO 8601日期格式的%Y-%m-%d。
%g
对应于ISO周号的年份,但没有世纪(0-99)。
%G
与ISO周号相对应的年份。 (例如,1991年。)
%u
以十进制数表示的星期几(1-7,其中星期一= 1)。
%V
ISO 8601:1988周编号为十进制数字(1-53)。如果包含1月1日的一周(从星期一开始)在新的一年中有四天或更多天,则将其视为第1周。否则,则是上一年的最后一周,而下一周是第1周。
%z
RFC-822 / ISO 8601标准时区规范。
%Z
时区名称。

类似地,由于GNU对strftime(3)的扩展,%k被接受为%H的同义词,%l应该被接受为%I的同义词,%P被接受为%p的同义词。最后

%s
自1970年1月1日00:00:00 +0000(UTC)以来的秒数。除非获得leap秒支持,否则不计算秒。

glibc实现不需要两个字段描述符之间的空格。

属性

有关本节中使用的术语的说明,请参见attribute(7)。

InterfaceAttributeValue
strptime()Thread safetyMT-Safe env locale

说明

strptime()函数与strftime(3)相反。它使用format指定的格式将s指向的字符串转换为存储在tm指向的"细分时​​间"结构中的值。

细分的时间结构tm定义如下:

struct tm {
    int tm_sec;    /* Seconds (0-60) */
    int tm_min;    /* Minutes (0-59) */
    int tm_hour;   /* Hours (0-23) */
    int tm_mday;   /* Day of the month (1-31) */
    int tm_mon;    /* Month (0-11) */
    int tm_year;   /* Year - 1900 */
    int tm_wday;   /* Day of the week (0-6, Sunday = 0) */
    int tm_yday;   /* Day in the year (0-365, 1 Jan = 0) */
    int tm_isdst;  /* Daylight saving time */
};

有关tm结构的更多详细信息,请参见ctime(3)。

format参数是一个由字段描述符和文本字符组成的字符串,让人想起scanf(3)。每个字段描述符由一个%字符组成,后跟另一个字符,用于指定该字段描述符的替换。格式字符串中的所有其他字符在输入字符串中必须具有匹配的字符,但空格必须与输入字符串中的零个或多个空格字符匹配,但空格除外。任何两个字段描述符之间都应该有空格或其他字母数字字符。

strptime()函数从左到右处理输入字符串。三个可能的输入元素(空格,文字或格式)中的每一个都一个接一个地处理。如果输入不能与格式字符串匹配,则函数停止。其余格式和输入字符串未处理。

支持的输入字段描述符在下面列出。如果要匹配文本字符串(例如星期几的名称或月份的名称),则比较不区分大小写。如果要匹配数字,则允许但不要求前导零。

%%
人物。
%aor %A
根据当前语言环境的星期几名称(缩写形式或全名)。
%bor %Bor %h
根据当前语言环境的月份名称(缩写形式或全名)。
%c
当前语言环境的日期和时间表示。
%C
世纪数字(0-99)。
%dor %e
每月的一天(1-31)。
%D
相当于%m /%d /%y。 (这是美国风格的日期,非美国人非常困惑,尤其是因为%d /%m /%y在欧洲广泛使用。ISO8601标准格式为%Y-%m-%d。)
%H
小时(0-23)。
%I
12小时制(1-12)的小时。
%j
一年中的天数(1-366)。
%m
月份号(1-12)。
%M
分钟(0-59)。
%n
任意空格。
%p
相当于AM或PM的语言环境。 (注意:可能没有。)
%r
12小时制(使用语言环境的AM或PM)。在POSIX语言环境中,等效于%I:%M:%S%p。如果t_fmt_ampm在当前语言环境的LC_TIME部分为空,则该行为未定义。
%R
相当于%H:%M。
%S
第二个(0-60; 60可能出现leap秒;更早的时候也允许61)。
%t
任意空格。
%T
等效于%H:%M:%S。
%U
星期几与星期天的第一天(0-53)。一月的第一个星期日是一周的第一天。
%w
星期几的序数(0-6),其中周日= 0。
%W
星期几,星期一为一周的第一天(0-53)。一月的第一个星期一是一周的第一天。
%x
日期,使用语言环境的日期格式。
%X
时间,使用语言环境的时间格式。
%y
世纪内的年份(0-99)。如果未另外指定一个世纪,则69-99范围内的值表示二十世纪(1969-1999)的年份; 00-68范围内的值表示二十一世纪(2000-2068)的年份。
%Y
包括世纪在内的年份(例如1991)。

某些字段描述符可以用E或O修饰符修改,以指示应使用其他格式或规范。如果当前语言环境中不存在替代格式或规范,则使用未修改的字段描述符。

E修饰符指定输入字符串可以包含日期和时间表示形式的其他与语言环境相关的版本:

%Ec
语言环境的替代日期和时间表示。
%EC
语言环境的替代表示形式中基准年(期间)的名称。
%Ex
语言环境的替代日期表示形式。
%EX
语言环境的替代时间表示形式。
%Ey
语言环境的替代表示形式中与%EC(仅年份)的偏移量。
%EY
替代年份的完整代表。

O修饰符指定数字输入可以采用与语言环境有关的替代格式:

%Odor %Oe
使用语言环境的备用数字符号的月份中的一天;前导零是允许的,但不是必需的。
%OH
使用语言环境的替代数字符号的小时(24小时制)。
%OI
使用语言环境的替代数字符号的小时(12小时制)。
%Om
使用语言环境的备用数字符号的月份。
%OM
使用语言环境的备用数字符号的分钟。
%OS
使用语言环境的备用数字符号的秒数。
%OU
使用语言环境的替代数字符号的一年中的星期数(星期日为一周的第一天)。
%Ow
星期几的序号(Sunday = 0), 使用语言环境的替代数字符号。
%OW
使用语言环境的替代数字符号的一年中的星期数(星期一为一周的第一天)。
%Oy
使用语言环境的替代数字符号的年份(与%C的偏移量)。

语法

#定义_XOPEN_SOURCE / 参见feature_test_macros(7)/
#包括

char * strptime(const char * s,const char * format,struct tm * tm);

STRPTIME - Linux手册页

Linux程序员手册 第3部分
更新日期: 2020-06-09

另外参见

time(2),getdate(3),scanf(3),setlocale(3),strftime(3)

日期:2019-08-20 18:01:25 来源:oir作者:oir