2011-02-02 98 views
2

如何将1970年以来的秒数转换为C++中的DateTime?
我得到了一次在以下格式:如何将1970年以来的秒数转换为C++中的DateTime?

1296575549:573352

结肠的左边部分是用秒和微秒右侧部分。
请帮忙。

感谢,
西德妮

+0

考虑使用boost – HyLian 2011-02-02 10:51:45

+0

您是否使用特定的DateTime库? – 2011-02-02 13:40:36

回答

3

使用boost::Date_Time做到这一点。下面的代码假设_interval是自1970年以来的秒数。请注意,此代码示例不处理微秒部分,但我确信可以修改它以执行此操作。

#include <boost/date_time/gregorian/gregorian_types.hpp> 
#include <boost/date_time/posix_time/posix_time.hpp> 

double interval(1296575549.0f); 
boost::posix_time::ptime m_DateTime = ptime(date(1970, 1, 1), 
            time_duration(0, 0, 0, 
            time_duration::ticks_per_second() * 
          (time_duration::fractional_seconds_type)_interval)); 
0

好,最复杂的案件:

86'400 s/day 

31'557'600 s/year (365.25 d) 


1296575549/31557600 = 41 years 

1296575549-41*31557600 = 2'713'949 s 

2713949/86400 ==> 31 d 

2713949-31*86400 =35'549 

35549/(60*60) = 9h 

35549-9*60*60 = 3'149 

3'149/(60*60) = 0h 

3'149- 0* (60*60) = 3'149 

3149/60 = 52 m 

3149-52*60 = 29s 

--> year = 1970 + 41 
--> month = 1 + 0 
--> day = 31 (+1?) 
--> Time 00:52:29 

==> 2011, Jan 31, 00:52:29 

要计算一个月从一天起,你需要复制粘贴一个isLeapYear函数,因为二月份。

嗯,看起来像一个也需要考虑直到最后一个闰年的闰年,这些闰年在剩余中被减去。嗯,夏令时间的影响...

睡觉!

+0

闰年,时区......没有什么不能用良好的思维来解决,但是自制的转换功能存在太多潜在问题。我建议不要这样做,因为有很多库能够在各种框架中执行转换。 – 2011-02-02 13:58:18

0

正如在几秒钟内持续的例子,让我们假设你想拥有你的程序的运行时间的想法:

#include <ctime> 
time_t startRawTime; 
time(&startRawTime); 
//...your program performs computations... 
time_t endRawTime; 
time(&endRawTime); 

time_t elapsedSec = difftime(endRawTime, startRawTime); 
// but elapsedSec can be any duration, e.g. 3734, as long as it is in seconds 

tm * ptm = gmtime(&elapsedSec); 
printf("elapsed time: %02dh %02dm %02ds\n", 
     ptm->tm_hour, 
     ptm->tm_min, 
     ptm->tm_sec); 

你会得到这样的事情,例如:

elapsed time: 01h 02m 14s 
2

有关使用C/C++库转换时间的三件重要事情。

  1. gmtime()或标准库localtime()从time_t的转换为结构TM,但time_t的分辨率是划时代秒。所以小数秒不会计数。

  2. mktime()将结构tm向后转换为time_t,但如果输入日期超出范围,它将返回-1。 (参考:year 2038 problem

  3. 如果您不使用64位时间戳,即使您在64位计算机上运行程序,仍然存在2038年问题。有64位版本的功能,如,localtime64(),mktime64(),可能会解决年度超出范围问题。 (Reference

相关问题