我需要将秒(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
谢谢大家
答案 0 :(得分:1)
1)它是如何运作的
将秒数转换为包含年,月,日等元素的结构。接下来,此结构将以标准格式打印到字符串缓冲区。然后打印此字符串缓冲区。
2)如何进入年,月,日等。
嗯,就是这个struct tm
。 localtime
会将指针返回给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, ...