侧边栏壁纸
博主头像
noerror

虚灵不寐,众理具而万事出。

  • 累计撰写 239 篇文章
  • 累计创建 9 个标签
  • 累计收到 2 条评论
标签搜索

目 录CONTENT

文章目录

getdate函数用法详解

noerror
2022-11-09 / 0 评论 / 0 点赞 / 125 阅读 / 1,368 字 / 正在检测是否收录...

getdate函数用法详解

getdate函数简介

  • 头文件包含

  • 函数定义
#include <time.h>
struct tm *getdate(const char * string );
extern int getdate_err;
#include <time.h>
int getdate_r(const char * string , struct tm * res );

getdate函数常见使用错误

  • 编译错误
    warning: implicit declaration of function ‘getdate’ [-Wimplicit-function-declaration]
    解决办法:包含头文件

getdate函数详细描述

函数getdate ()将string 指向的缓冲区中包含的日期和时间的字符串表示形式转换为分解时间。分解时间存储在tm结构中,指向该结构的指针作为函数结果返回。这个tm结构被分配在静态存储中,因此它将被对getdate ()的进一步调用所覆盖
与strptime (3)(它有一个format参数)相反,getdate ()使用文件中的格式,该文件的完整路径名在环境变量DATEMSK 中给出。文件中与给定输入字符串匹配的第一行用于转换。
匹配不区分大小写。模式或要转换的字符串中的多余空白将被忽略。
模式可以包含的转换规范是为strptime (3)给出的规范。POSIX.1-2001中还指定了另一个转换规范:

  • %Z 时区名称。这在glibc中没有实现。

当给定 %Z 时,包含分解时间的结构用对应于给定时区中当前时间的值初始化。否则,该结构被初始化为与当前本地时间相对应的分解时间(如通过调用localtime (3))
如果只给出一周中的某一天,则该天被视为今天或之后的第一天。
当只给出月份(而不给出年份)时,该月被视为等于或晚于当前月份的第一个此类月份。如果没有给出日期,那就是这个月的第一天。
如果没有给出小时、分钟和秒,则取当前小时、分钟和秒。
如果没有给出日期,但我们知道小时,则该小时被视为等于或晚于当前小时的第一个小时。
getdate_r ()是一个GNU扩展,它提供了getdate ()的可重入版本,而不是使用全局变量来报告错误和静态缓冲区来返回故障时间,它通过函数result值返回错误,并在参数res 指向的调用者分配的缓冲区中返回结果故障时间

getdate函数返回值

如果成功,getdate ()返回指向"struct tm" 的指针,否则返回NULL并将全局变量getdate_err设置为如下所示的错误号之一。对errno的更改未指定。
成功时,getdate_r ()返回0;出错时,它返回如下所示的错误号之一。

getdate函数错误码

以下错误通过getdate_err(对于getdate ())或作为函数结果(对于getdate_r ()):)返回

  • 1 未定义 DATEMSK 环境变量,或者其值为空字符串。
  • 2 无法打开 DATEMSK 指定的模板文件进行读取。
  • 3 无法获取文件状态信息。
  • 4 模板文件不是常规文件。
  • 5 读取模板文件时遇到错误。
  • 6 内存分配失败(内存不足)。
  • 7 文件中没有与输入匹配的行。
  • 8 无效的输入规范。

getdate函数其他说明

strptime (3)的POSIX.1规范包含使用 %E%O 修饰符的转换规范,而glibc中的getdate ()没有给出此类规范,而getdate ()是使用strptime (3)实现的,因此两者都支持完全相同的转换。

getdate函数使用举例

下面的程序为其每个命令行参数调用getdate (),并为每次调用显示返回的tm结构的字段中的值。以下shell会话演示程序的操作:

" TFILE=$PWD/tfile"
" echo \(aq%A\(aq > $TFILE " "      # Full name of the day of the week"
" echo \(aq%T\(aq >> $TFILE" "      # ISO date (YYYY-MM-DD)"
" echo \(aq%F\(aq >> $TFILE" "      # Time (HH:MM:SS)"
" date"
" export DATEMSK=$TFILE"
" ./a.out Tuesday \(aq2009-12-28\(aq \(aq12:22:33\(aq"
Sun Sep  7 06:03:36 CEST 2008
Call 1 ("Tuesday") succeeded:
   tm_sec   = 36
   tm_min   = 3
   tm_hour  = 6
   tm_mday  = 9
   tm_mon   = 8
   tm_year  = 108
   tm_wday  = 2
   tm_yday  = 252
   tm_isdst = 1
Call 2 ("2009-12-28") succeeded:
   tm_sec   = 36
   tm_min   = 3
   tm_hour  = 6
   tm_mday  = 28
   tm_mon   = 11
   tm_year  = 109
   tm_wday  = 1
   tm_yday  = 361
   tm_isdst = 0
Call 3 ("12:22:33") succeeded:
   tm_sec   = 33
   tm_min   = 22
   tm_hour  = 12
   tm_mday  = 7
   tm_mon   = 8
   tm_year  = 108
   tm_wday  = 0
   tm_yday  = 250
   tm_isdst = 1

Program source&

#define _GNU_SOURCE
#include <time.h>
#include <stdio.h>
#include <stdlib.h>

int
main(int argc, char *argv[])
{
   struct tm *tmp;

   for (int j = 1; j < argc; j++) {
       tmp = getdate(argv[j]);

       if (tmp == NULL) {
           printf("Call %d failed; getdate_err = %d\en",
                  j, getdate_err);
           continue;
       }

       printf("Call %d (\e"%s\e") succeeded:\en", j, argv[j]);
       printf("    tm_sec   = %d\en", tmp\->tm_sec);
       printf("    tm_min   = %d\en", tmp\->tm_min);
       printf("    tm_hour  = %d\en", tmp\->tm_hour);
       printf("    tm_mday  = %d\en", tmp\->tm_mday);
       printf("    tm_mon   = %d\en", tmp\->tm_mon);
       printf("    tm_year  = %d\en", tmp\->tm_year);
       printf("    tm_wday  = %d\en", tmp\->tm_wday);
       printf("    tm_yday  = %d\en", tmp\->tm_yday);
       printf("    tm_isdst = %d\en", tmp\->tm_isdst);
   }

   exit(EXIT_SUCCESS);
}
0

评论区