【问题标题】:How to compare string date with time_t in c++?如何在 C++ 中将字符串日期与 time_t 进行比较?
【发布时间】:2014-04-02 00:31:38
【问题描述】:

我下面有字符串。

std::string _valid = "2014-03-28 16:45:59";

int y1, M1, d1, h1, m1, s1;
sscanf_s(_valid.c_str(), "%d-%d-%d %d:%d:%d", &y1, &M1, &d1, &h1, &m1, &s1);

现在,我可以得到年、月、日等等...

现在,我必须确定该时间是否早于当前日期时间。

time_t now  = time(NULL);

但是,time_t 总是以 unix 时间戳返回我的时间。

如何比较日期?

【问题讨论】:

    标签: c++ datetime


    【解决方案1】:

    设置为struct tm,然后通过函数mktime生成time_t。可以直接比较两个time_t的值。

    您还可以使用 windows.h 中的 SYSTEMTIMEFILETIME。设置为 SYSTEMTIME 然后通过函数SystemTimeToFileTime 生成 FILETIME。通过函数 CompareFileTime 比较两个 FILETIME。 为了计算两个 FILETIME 之间的距离,我正在编写以下丑陋的代码:

    __int64 duration = ((*(__int64 *)&ft2) - (*(__int64 *)&ft1));
    

    请注意,SYSTEMTIME 比 struct tm 具有更高的分辨率。

    【讨论】:

    • 谢谢。这很有帮助。
    【解决方案2】:

    我认为您正在寻找 mktime 功能。详情在这里http://linux.die.net/man/3/mktime,但简而言之......

    #include <time.h>
    time_t mktime(struct tm *tm);
    

    其中 struct tm 在 time.h 中定义为...

    struct tm
    {
      int tm_sec;           /* Seconds. [0-60] (1 leap second) */
      int tm_min;           /* Minutes. [0-59] */
      int tm_hour;          /* Hours.   [0-23] */
      int tm_mday;          /* Day.     [1-31] */
      int tm_mon;           /* Month.   [0-11] */
      int tm_year;          /* Year - 1900.  */
      int tm_wday;          /* Day of week. [0-6] */
      int tm_yday;          /* Days in year.[0-365] */
      int tm_isdst;         /* DST.     [-1/0/1]*/
    
    #ifdef  __USE_BSD
      long int tm_gmtoff;       /* Seconds east of UTC.  */
      __const char *tm_zone;    /* Timezone abbreviation.  */
    #else
      long int __tm_gmtoff;     /* Seconds east of UTC.  */
      __const char *__tm_zone;  /* Timezone abbreviation.  */
    #endif
    };
    

    希望这会有所帮助。

    【讨论】:

    • 生成struct tm 的另一种方法是使用sscanf,而不是使用strptime 函数(strftime 的反函数)。这不是标准 C,但它可以读取更多可能的日期/时间格式。如果您的系统没有它,那么您可以下载一个开源版本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多