将秒(unix时间)转换为人类可读(到不同的变量)

时间:2017-11-24 17:04:28

标签: c time

我需要将秒(unix时间)转换为人类可读时间。

我使用此代码:

int humanreadable(seconds){
time_t     now=seconds;
struct tm  ts;
char       buf[80];
ts = *localtime(&now);
strftime(buf, sizeof(buf), "%Y %m %d", &ts);
printf("%s\n", buf);
return 0;
}

它运作良好,但我有两个问题。

首先,我真的不明白它是如何运作的。这是学校的家庭作业,我们尚未介绍结构如何工作,所以我使用它是非常奇怪的。现在,这不是一个真正的问题,因为计算机会检查出代码,所以只要我们的代码输出正确的东西,我们如何得到它就无所谓了。

第二(我的实际问题)。这个函数输出(打印)一个字符串,其中包含年,月和日(格式化),但我需要在三个单独的变量中使用y,m,d,因为我需要稍后将它们用于不同的函数。我怎样才能做到这一点。

我需要使用三个变量的第二个函数:

int prevFullMoon ( int y, int m, int d, int * prevY, int * prevM, int * prevD)
{
if(valid_date(y,m,d)==INVALID_DATE){
return valid_date(y,m,d);
}
int tmp=epoch(y,m,d);
while (isFullMoonEpochCheck(tmp)!=1) {
tmp=tmp-ONE_DAY;
}
return tmp;
}

此函数从输入获取y,m,d(主函数使用assert来评估函数(这是计算机检查的方式))并且需要在上一次满月时输出(需要输出prevY) ,prevM,prevD)。目前它输出时间但以秒为单位(unix时间)。否则它的工作原理应该如何。

PS。我在这里有点时间限制(只剩下几天了)所以在这一点上我只是需要它才能工作,但是欢迎任何解释(或解释/教材的指示)。

感谢您的帮助

我每次运行程序时都会返回随机数的新代码:

int humanreadable(int seconds){
  int prevY,prevD,prevM;
  struct tm ts;
    time_t now=seconds;
    ts = *localtime(&now);
    prevY = &ts.tm_year+1900;
    prevM = &ts.tm_mon+1;
    prevD = &ts.tm_mday;
    printf("%d %d %d\n",prevY,prevM,prevD); //only temporary to find out what thea variables return //later need to pass it to prevFullMoon as pointers
    return 0;
}

int prevFullMoon ( int y, int m, int d){// int * prevY, int * prevM, int * prevD){//temporarely disabled pointers, later need to add them back so assert in main works
  if(valid_date(y,m,d)==INVALID_DATE){
    return valid_date(y,m,d);
  }
  int tmp=epoch(y,m,d);
  while (isFullMoonEpochCheck(tmp)!=1) {
   tmp=tmp-ONE_DAY;
  }
  humanreadable(tmp);
}

int main ( int argc, char * argv [] )
{
  prevFullMoon( 2017, 1, 11);
  //assert ( prevFullMoon ( 2017, 1, 11, &y, &m, &d ) == 1 && y == 2016 && m == 12 && d == 14 );
}

我还添加了一些评论,可以解释我需要实现的目标

是的,想通了。

 prevY = &ts.tm_year+1900

应该是

 prevY = ts.tm_year+1900

谢谢大家

1 个答案:

答案 0 :(得分:1)

1)它是如何运作的

将秒数转换为包含年,月,日等元素的结构。接下来,此结构将以标准格式打印到字符串缓冲区。然后打印此字符串缓冲区。

2)如何进入年,月,日等。

嗯,就是这个struct tmlocaltime会将指针返回给struct tm,然后将该结构的数据复制到您自己的ts。现在您需要访问这些字段。你需要了解这一点,但我会帮助你:

struct tm {    // definition of struct tm
        int tm_sec;     /* seconds after the minute - [0,59] */
        int tm_min;     /* minutes after the hour - [0,59] */
        int tm_hour;    /* hours since midnight - [0,23] */
        int tm_mday;    /* day of the month - [1,31] */
        int tm_mon;     /* months since January - [0,11] */
        int tm_year;    /* years since 1900 */
        int tm_wday;    /* days since Sunday - [0,6] */
        int tm_yday;    /* days since January 1 - [0,365] */
        int tm_isdst;   /* daylight savings time flag */
        };

将正确的字段传递给您的函数prevFullMoon ( int y, int m, int d...执行:

prevFullMoon ( ts.tm_year+1900, ts.tm_mon+1, ts.tm_mday, ...