strptime ()- 将字符串转换为日期/时间

格式

#include <time.h>
char *strptime(const char *buf, const char *format, struct tm *tm);

语言级别

XPG4

线程安全

语言环境敏感

此函数的行为可能受当前语言环境的 LC_CTYPE , LC_TIME 和 LC_TOD 类别影响。 当在编译命令上指定 LOCALETYPE (*CLD) 时,此功能不可用。 有关更多信息,请参阅 了解 CCSID 和语言环境

描述

strptime() 函数使用 format指定的格式将 buf 指向的字符串转换为 tm指向的 tm 结构中存储的值。

format 包含零个或多个伪指令。 伪指令包含普通字符 (不是% 或空格) 或转换规范。 每个转换规范都由后跟一个或多个转换字符的% 字符组成,这些字符指定所需的替换。 必须在 bufformat 中都有空格或其他定界符,才能保证函数的行为符合预期。 两个字符串到数字转换之间必须有一个定界符,或者第一个数字转换可以转换属于第二个转换说明符的字符。

在以格式字符串或输入字符串扫描伪指令之前迂到的任何空格 (由 isspace()指定) 都将被忽略。 作为普通字符的伪指令必须与输入字符串中的下一个扫描字符完全匹配。 当匹配普通字符伪指令时,大小写相关。 如果格式字符串中的普通字符伪指令与输入字符串中的字符不匹配,那么 strptime() 不成功。 将不再扫描任何字符。

通过扫描输入字符串中的字符来匹配任何其他转换规范,直到找到不是该规范的可能字符的字符或直到无法扫描更多字符为止。 如果规范是字符串到数字,那么可能的字符范围是 + ,-或由 isdigit()指定的字符。 数字说明符不需要前导零。 如果规范需要与当前语言环境中的字段匹配,那么将重复扫描,直到找到匹配项为止。 在语言环境中匹配字段时,将忽略大小写。 如果找到匹配项,那么将使用相应的语言环境信息更新 tm 指向的结构。 如果找不到匹配项,那么 strptime() 不成功。 将不再扫描任何字符。

如果提供了足够的信息,那么 tm 结构中缺少的字段可能由 strptime() 填充。 例如,如果给定了日期,那么可以计算 tm_yday

每个标准转换规范都将替换为相应的字符,如下表中所述:

指定者 含义
%a 星期几的名称,可以是全名或缩写。
%A 与 %a 相同。
%b 月份名称,可以是全名或缩写。
%B 与 %b相同。
%c 日期/时间,采用语言环境的格式。
%C 世纪号 [00-99]。 如果使用两位数的年份,那么计算年份。
%d 月日 [1-31]。
%D 日期格式,与 %m/%d/%y 相同。
%e 与 %d相同。
%g ISO 周日期 [00-99] 的 2 数字年份部分。
%G ISO 周日期的 4 数字年份部分。 可以为负数。
%h 与 %b相同。
%H 24 小时格式的小时 [0-23]。
%I 12 小时格式的小时 [1-12]。
%j 年月日 [1-366]。
%m 月 [1-12]。
%M 分钟 [0-59]。
%n 跳过所有空格,直到找到换行符。
%p AM 或 PM 字符串,用于计算小时 (如果使用 12 小时格式)。
%r 语言环境的 AM/PM 格式的时间。 如果语言环境时间格式不可用,那么缺省为 POSIX 时间 AM/PM 格式: %I: %M: %S %p。
%R 不带秒的 24 小时时间格式,与 %H 相同: %M。
%S 第二次 [00-61]。 秒的范围允许跳跃秒和双跳跃秒。
%t 跳过所有空格,直到找到制表符。
%T 24 小时时间格式 (以秒计) ,与 %H: %M: %S 相同。
%u 平日 [1-7]。 "星期一" 为 1 , "星期日" 为 7。
%U 一年中的周数 [0-53] ,星期天是一周中的第一天。 用于计算一年中的某一天。
%V ISO 年度周号 [1-53]。 周一是一周的第一天。 如果包含 1 月 1 日的一周在新的一年里有四天或四天以上,则视为第 1 周。 否则,是上一年的最后一周,下一周是新一年的 1 周。 用于计算一年中的某一天。
%w 平日 [0 -6]。 星期日为 0。
%W 年份的周数 [0-53]。 周一是一周的第一天。 用于计算一年中的某一天。
%x 语言环境格式的日期。
%X 语言环境格式的时间。
%y 2-数字年份 [0-99]。
%Y 4-数字年份。 可以为负数。
%z UTC 偏移量。 输出是格式为 +HHMM-HHMM的字符串,其中 + 表示 GMT 以东,-表示 GMT 以西, HH 表示 GMT 的小时数, MM 表示 GMT 的分钟数。
%Z 时区名称。
%% % 字符。

已修改的转换规范

某些转换说明符可由 E 或 O 修饰符字符修改,以指示应使用备用格式或规范。 如果修改后的转换说明符使用当前语言环境中不可用的字段,那么行为将如同使用了未修改的转换规范一样。 例如,如果 era 字符串是空字符串 "" ,这意味着 era 不可用,那么 %EY 将类似于 %Y。

指定者 含义
%ec 当前时代的日期/时间。
%ec 时代名称。
%Ex 当前时代的日期。
%EX 当前时代的时间。
% Ey 时代年。 这是与基准年的偏移量。
%EY 当前时代的年份。
其他 (%O) 使用备用数字的月中的第几天。
%Oe 与 %Od 相同。
%OH 24 小时格式的小时 (使用备用数字)。
%OI 12 小时格式的小时 (使用备用数字)。
其他 (%O) 使用备用数字的月份。
%OM 使用备用数字的分钟数。
%OS 使用备用数字的秒数。
%Ou 使用备用数字的星期几。 "星期一" 为 1 , "星期日" 为 7。
%OU 年份的周数 (使用备用数字)。 周日是一周的第一天。
%OV 使用备用数字的 ISO 年度周数。 请参阅 %V 以获取 ISO 周号的说明。
其他 (%O) 使用备用数字的工作日。 星期日为 0 ,星期六为 6。
工作单元 %W 年份的周数 (使用备用数字)。 周一是一周的第一天。
其他 (%O) 2-使用备用数字的数字年份。
%OZ 缩写时区名称。

返回值

成功完成时, strptime() 函数将返回一个指针,该指针指向解析的最后一个字符之后的字符。 否则,将返回空指针。 errno 的值可以设置为 ECONVERT (转换错误)。

示例

#include <stdio.h>
#include <locale.h>
#include <time.h>

int main(void)
{
    char buf[100];
    time_t t;
    struct tm *timeptr,result;

    setlocale(LC_ALL,"/QSYS.LIB/EN_US.LOCALE");
    t = time(NULL);
    timeptr = localtime(&t);
    strftime(buf,sizeof(buf), "%a %m/%d/%Y %r", timeptr);

    if (strptime(buf, "%a %m/%d/%Y %r",&result) == NULL)
          printf("\nstrptime failed\n");
    else
    {
          printf("tm_hour:  %d\n",result.tm_hour);
          printf("tm_min:  %d\n",result.tm_min);
          printf("tm_sec:  %d\n",result.tm_sec);
          printf("tm_mon:  %d\n",result.tm_mon);
          printf("tm_mday:  %d\n",result.tm_mday);
          printf("tm_year:  %d\n",result.tm_year);
          printf("tm_yday:  %d\n",result.tm_yday);
          printf("tm_wday:  %d\n",result.tm_wday);
    }
 
    return 0;
}

/************************************************************
     The output should be similar to:
     Tue 10/30/2001 10:59:10 AM
     tm_hour:  10
     tm_min:  59
     tm_sec:  10
     tm_mon:  9
     tm_mday:  30
     tm_year:  101
     tm_yday:  302
     tm_wday:  2
************************************************************/

相关信息