0

我正在尝试在程序中包含系统日期,该日期将计算自 2000 年以来的总天数。这样我就可以将各种日期的值(如防病毒更新日期、操作系统更新日期)与它进行比较,以找出什么是系统更新延迟。在 C 中查找日期的过程让我很生气,所以我使用系统命令来找出当前日期。

    system("date/t > system_date.txt");

我想从此文件中读取日期。如果日期全部为数字(例如- 03/09/13),则没有问题。但是从 DOS 显示的日期类型为:03-Sep-13。如果我使用 sscanf 如下:

    FILE *fp_date=fopen("system_date.txt","r");
    char buffer[11];   int day,yr;   char yr[3];
    fgets(buffer,11,fp_date);
    sscanf("%d-??????-%d",&day,&mon,&yr);

现在如何使用它们的数据类型分别扫描它们?我不知道用什么代替??????。或者我一直在使用的另一种方法是将整行存储在一个数组中,然后运行 ​​for 循环以获取由“-”分隔的元素。但我只是想变得更复杂一点。谢谢...

4

3 回答 3

3

您不需要system(甚至不需要date命令)。顺便说一句,使用popen("date","r")可能更简单,但仍然不是正确的方法。

首先阅读time(7)手册页。

然后使用类似的代码

  time_t now=0;
  time (&now);
  struct tm* ltm = localtime(&now);

time(2)系统调用以秒为单位给出了从 Unix纪元(1970 年开始)开始的时间。如果您想要更高的精度(或测量 CPU、或线程、时间),请使用clock_gettime(2 )。gettimeofday(2)已过时。localtime(3)将 Unix 时间转换为struct tm包含秒、分钟、... 星期几、月份日期、月份、...的字段。用于a到 amktime的相反转换。并且也由其他函数或系统调用给出(如stat(2)给出有关文件的元数据,包括其修改时间)。struct tmtime_ttime_t

ltm您可以以编程方式使用字段,例如ltm->tm_sec秒、ltm->tm_min分钟、....ltm->tm_mon月份(0 表示一月等)等......

如果您想要一个字符串,请使用strftime(3) 之类的

  char timebuf[32];
  strftime (timebuf, sizeof(timbuf), "%d %b %Y", ltm);

相反的函数是strptime(3),它将字符串解析为struct tm.

请注意strftime使用本地化(首先请参阅locale(7))。因此,您的用户可以从%b(如果他的系统本地化为法语)获得法语缩写月份。

如果您想要通用(所谓的 GMT)时间,请使用gmtime而不是localtime. 在多线程程序中使用localtime_ra,dgmtime_r并给它们你自己的struct tm.

于 2013-09-03T05:38:57.853 回答
2

不要这样做。在 C 中获取当前日期/时间很简单:

#include <time.h>
/* ... */
struct tm *tm = localtime(time(0));

您尝试这样做的方式要困难得多,更不用说容易出错了。(例如,如果两个实例同时运行并且都尝试写入同一个文件,会发生什么?)一般来说,system做某事的方法总是错误的。

于 2013-09-03T05:38:33.937 回答
2

不要那样做。只需使用time(2)(C89) 或gettimeofday(3)(POSIX) 以Unix 时间格式获取当前系统时间。如果您需要将其转换为其他形式,如字符串表示或struct tm对象,则可以使用各种转换函数,例如ctime(3)gtime(3)localtime(3)

#include <time.h>

time_t now = time(NULL);
printf("The current time is: %s\n", ctime(&now));  // Warning: not thread-safe

struct tm *now_tm = localtime(now);  // Warning: not thread-safe
printf("Year=%d month=%d day=%d\n hour=%d minute=%d second=%d",
       1900 + now_tm->tm_year,
       1 + now_tm->tm_mon,
       now_tm->tm_mday,
       now_tm->tm_hour,
       now_tm->tm_min,
       now_tm->tm_sec);
于 2013-09-03T05:38:56.760 回答