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

标签 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) ,前一个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 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, ...

关于将秒(unix 时间)转换为人类可读的(不同的变量),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47477553/

相关文章:

c - printf 和 gets 的区别

objective-c - Float 和 int 数据类型影响性能

c - 如何在不使用指针的情况下在 C 中无转换地转换对象?

ruby-on-rails - 在测试期间模拟当前日期

python - 如何每天上午10点运行python函数

c - 一个 friend 给我发了一段我不明白的片段。这是如何运作的?

c - 如何使用 C 在控制台应用程序中更改字体大小

unix - 使用/usr/bin/time 时如何忽略程序的输出?

python - 使用记录器在日志名称中添加时间

Javascript:计算今天和下一个特定工作日时间之间的时间