我需要将秒(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) ,前一个VM,前一个VD)。目前它输出时间,但以秒为单位(unix 时间)。否则它会按其应有的方式工作。
PS。我在这里的时间有限(只剩下几天了),所以在这一点上我只是需要它工作,但欢迎任何解释(或指向解释/教学 Material 的指针)。感谢您的帮助
<小时/>我的新代码每次运行程序时都会返回随机数:
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)它是如何工作的
秒数被转换为包含年、月、日等元素的结构。接下来,该结构以标准格式打印到字符串缓冲区。然后打印这个字符串缓冲区。
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, ...
关于将秒(unix 时间)转换为人类可读的(不同的变量),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47477553/