使用sscanf获取系统日期(int和char混合)

使用sscanf获取系统日期(int和char混合),c,C,我试图在一个程序中包含系统日期,该程序将计算自2000年以来的总天数。这样我就可以比较不同日期的值(比如-Antivirus update date,OS update date),以找出系统更新的延迟。在C中查找日期的过程让我非常痛苦,所以我使用系统命令查找当前日期 system("date/t > system_date.txt"); 我想从这个文件中读取日期。如果日期都是数字(例如-03/09/13),则没有问题。但DOS显示的日期类型为:03-Sep-13。如果我按如下方

我试图在一个程序中包含系统日期,该程序将计算自2000年以来的总天数。这样我就可以比较不同日期的值(比如-Antivirus update date,OS update date),以找出系统更新的延迟。在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循环以获得由“-”分隔的元素。但我只是想变得更老练一点。谢谢…

不要这样做。用C语言获取当前日期/时间非常简单:

#include <time.h>
/* ... */
struct tm *tm = localtime(time(0));
#包括
/* ... */
struct tm*tm=localtime(时间(0));
您尝试这样做的方式要困难得多,更不用说容易出错了。(例如,如果两个实例同时运行,并且都试图写入同一个文件,会发生什么情况?)一般来说,
system
总是错误的做法。

不要这样做。只需使用(C89)或(POSIX)即可获得当前系统时间。如果需要将其转换为其他形式,如字符串表示或
struct tm
对象,则可以使用各种转换函数,例如

#包括
time\u t now=时间(空);
printf(“当前时间为:%s\n”,ctime(&now));//警告:不是线程安全的
struct tm*now_tm=localtime(now);//警告:不是线程安全的
printf(“年=%d月=%d日=%d\n小时=%d分钟=%d秒=%d”,
1900+现在->过去一年,
1+现在\u tm->tm\u mon,
现在_tm->tm\mday,
现在_tm->tm\u小时,
现在_tm->tm_min,
现在(tm->tm秒);

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

首先阅读手册页

然后使用如下代码

  time_t now=0;
  time (&now);
  struct tm* ltm = localtime(&now);
系统调用以秒为单位给出从Unix开始的时间(1970年开始)。如果需要更高的精度(或测量CPU或线程、时间),请使用。它正在变得过时。将Unix时间转换为包含秒、分钟等的
struct tm
。。。星期几、月日、月。。。。领域。使用
mktime
struct tm
转换为
time
。而
time\u t
也由其他函数或系统调用提供(比如提供有关文件的元数据,包括其修改时间)

您可以通过编程方式使用
ltm
中的字段,如
ltm->tm_-sec
秒,
ltm->tm_-min
分钟<代码>ltm->tm_mon
月份(0表示一月等),等等

如果需要字符串,请使用like

相反的函数是将字符串解析为
struct tm

请注意,
strftime
使用本地化(请参见第一部分)。因此,您的用户可以从
%b
(如果他的系统为法语本地化)获得法语缩写月份


如果您想要通用(所谓的GMT)时间,请使用
gmtime
而不是
localtime
。在多线程程序中,使用
localtime\r
a、d
gmtime\r
并为它们提供自己的
struct tm

问题是什么?您似乎已经知道如何使用
%d
获取它们的数据类型。由于月份是以字符串形式列出的,因此您应该在那里使用
%s
,然后执行一些快速分析,以确定哪个月份是一个整数。如果“在C中查找日期的过程正在扼杀”您,这显然不是一个更好的解决方案。请注意,
gettimeofday
正在变得过时。今天,更好地使用
clock\u gettime
伙计们,你们能告诉我windows机器上的时间吗?这一次对于linux来说是可以的,但是当我在windows机器上运行代码时,它就不工作了。@Kris:对于windows来说,这段代码应该是完美的。如果你使用它有问题,问一个新问题。非常感谢。。。你们解决了我的问题。谢谢你抽出时间。
  time_t now=0;
  time (&now);
  struct tm* ltm = localtime(&now);
  char timebuf[32];
  strftime (timebuf, sizeof(timbuf), "%d %b %Y", ltm);