2011-11-28 152 views
2

问题很简单,在其他语言中有很多API特定的方法,但我没有发现这对于跨平台C++使用来说简单直接。两个日期之间的秒差?

如果我有两个日期,并且它们被假定为在相同的语言环境中,那么在C++中区分它们的最简单方法是什么?

我有(有点)看着使用time.h,创建两个tm对象,将它们转换为UTC然后区分它们。

的日期目前的格式为:YY/MM/DD HH:mm:SS(存储为单个整数)

编辑:

好了,根据目前的答案,我已经做了以下的(现在):

time_t calculate_seconds_between(
    const uint Y1, const uint M1, const uint D1, const uint H1, const uint m1, const uint S1, // YY/MM/DD HH:mm:SS 
    const uint Y2, const uint M2, const uint D2, const uint H2, const uint m2, const uint S2 
) 
{ 
    time_t raw; 
    time(&raw); 

    struct tm t1 = *gmtime(&raw), t2 = t1; 

    t1.tm_year = Y1 - 1900; 
    t1.tm_mon = M1 - 1; 
    t1.tm_mday = D1; 
    t1.tm_hour = H1; 
    t1.tm_min = m1; 
    t1.tm_sec = S1; 

    t2.tm_year = Y2 - 1900; 
    t2.tm_mon = M2 - 1; 
    t2.tm_mday = D2; 
    t2.tm_hour = H2; 
    t2.tm_min = m2; 
    t2.tm_sec = S2; 

    time_t tt1, tt2; 
    tt1 = mktime(&t1); 
    tt2 = mktime(&t2); 

    return (tt2 - tt1); 
} 

这很好。

+1

请注意,两次之间的差异不取决于时区,只要它是一致的即可。即17:00:00(UTC + 1)和17:05:00(UTC + 1)之间的差异与16:00:00(UTC)和16:05:00(UTC)之间的差异相同。 (夏令时确实是另一个时区;请注意这一点)。 – MSalters

+0

@ MSalters,是的,我刚刚意识到这一点。有时候只是写出这个问题给出了产生答案所需的清晰度......这是令人沮丧的,因为我通常使用SO作为我的最后手段(即,几个小时过去)。干杯:) – dcousens

+0

@Daniel你为什么使用gmtime?您需要更新哪些字段? – selalerer

回答

3

YY/MM/DD HH:mm:SS转换为struct tm你可以使用strptime(或进行等价的,如果你没有的话)

const char * dateInput; 
// .... 
struct tm tm; 
time_t val; 

memset(&tm, 0, sizeof(struct tm)); 
strptime(dateInput,"%y/%m/%d %H:%M:%S",&tm); 
val = mktime(&tm); 

之后,你有两个time_t值,您可以拨打difftime

0

新的C++ 11具有计时库(也可以从boost,对于非C++ 11个编译)

有了它,你可以做漂亮的东西像

boost::chrono::system_clock::time_point start = boost::chrono::system_clock::now(); 
// ... 
boost::chrono::duration<double> sec = boost::chrono::system_clock::now() - start; 
std::cout << "took " << sec.count() << " seconds\n"; 

typedef boost::chrono::duration<long, boost::ratio<60> > minutes; 
minutes m1(3);     // m1 stores 3 
minutes m2(2);     // m2 stores 2 
minutes m3 = m1 + m2;   // m3 stores 5