【问题标题】:converting string time to seconds将字符串时间转换为秒
【发布时间】:2011-07-04 09:26:49
【问题描述】:

这是我将字符串时间转换为日期时间格式并将时间转换为秒的代码,但它显示了一些奇怪的值。请帮帮我

代码:

struct tm tm;
time_t t;
char s[25]="Sat Feb 19 12:53:39 2011";
if (strptime(s, "%A %b %d %H:%M:%S %Y", &tm) != NULL)


printf("year: %d; month: %d; day: %d;\n", tm.tm_year, tm.tm_mon, tm.tm_mday);
printf("hour: %d; minute: %d; second: %d\n",  tm.tm_hour, tm.tm_min, tm.tm_sec);
printf("week day: %d; year day: %d\n", tm.tm_wday, tm.tm_yday);

tm.tm_isdst = -1;      
t = mktime(&tm);
printf("seconds since the Epoch: %ld\n", (long) t);

输出是

年:111;月:1;第 19 天;

小时:12;分钟:53;第二:40

工作日:6;年日:49

自纪元以来的秒数:1298102020

【问题讨论】:

  • 什么奇怪的值?我看到的唯一奇怪的事情是线条是如何分解的。

标签: c datetime


【解决方案1】:

来自http://en.wikipedia.org/wiki/Time.h

C 标准库中的日历时间(也称为“分解时间”)表示为 struct tm 结构,由以下成员组成:

Member  Description
int tm_hour hour (0 – 23)
int tm_isdst    Daylight saving time enabled (> 0), disabled (= 0), or unknown (< 0)
int tm_mday day of the month (1 – 31)
int tm_min  minutes (0 – 59)
int tm_mon  month (0 – 11, 0 = January)
int tm_sec  seconds (0 – 60, 60 = Leap second)
int tm_wday day of the week (0 – 6, 0 = Sunday)
int tm_yday day of the year (0 – 365)
int tm_year year since 1900

即您需要将 1900 添加到年份,月份是从零开始的。

【讨论】:

【解决方案2】:

您必须将 1900 添加到 tm.tm_year。

【讨论】:

    【解决方案3】:

    tm.tm_year 是自 1900 年以来的年份数。月份 0 是一月。只需根据需要进行调整即可。

    【讨论】:

      【解决方案4】:

      输出是正确的。 struct tm 存储时间如下:

      Member         Meaning            Range 
      tm_sec   seconds after the minute  0-61* 
      tm_min   minutes after the hour    0-59 
      tm_hour  hours since midnight      0-23 
      tm_mday  day of the month          1-31 
      tm_mon   months since January      0-11 
      tm_year  years since 1900  
      tm_wday  days since Sunday         0-6 
      tm_yday  days since January 1      0-365 
      tm_isdst Daylight Saving Time flag 
      

      Source

      【讨论】:

        【解决方案5】:
        struct tm tm;
        time_t t;
        char s[25]="Sat Feb 19 12:53:39 2011";
        if (strptime(s, "%A %b %d %H:%M:%S %Y", &tm) != NULL)
        
        /* Don't do: tm.tm_year += 1900; 
           before computing the Epoch or you'll break it! 
        */
        
        printf("year: %d; month: %d; day: %d;\n", tm.tm_year + 1900, tm.tm_mon, tm.tm_mday);
        printf("hour: %d; minute: %d; second: %d\n",  tm.tm_hour, tm.tm_min, tm.tm_sec);
        printf("week day: %d; year day: %d\n", tm.tm_wday, tm.tm_yday);
        
        tm.tm_isdst = -1;      
        t = mktime(&tm);
        printf("seconds since the Epoch: %ld\n", (long) t); 
        

        【讨论】:

          猜你喜欢
          • 2013-02-17
          • 2012-05-26
          • 2011-07-11
          • 1970-01-01
          • 1970-01-01
          • 2016-08-01
          • 1970-01-01
          • 2014-11-27
          • 2021-04-13
          相关资源
          最近更新 更多