【问题标题】:Unix time conversion returning random numbersUnix 时间转换返回随机数
【发布时间】:2018-05-08 20:04:28
【问题描述】:

我有一些代码可以计算上一次满月发生的时间。

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);        // Works correctly, returns "2016 12 14", not needed, only used to for a check
    int prevY = &ts.tm_year+1900;
    int prevM = &ts.tm_mon+1;
    int prevD = &ts.tm_mday;
    printf("%d %d %d\n", prevY,prevM,prevD); // Does not work, returns random numbers
    //later add return prevY/prevM/prevD pointers so I can pass them on
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);
  return 1;
}

int main ( int argc, char * argv [] )
{
  prevFullMoon( 2017, 1, 11);       //temporary code to check what it is returning
  //assert ( prevFullMoon ( 2017, 1, 11, &y, &m, &d ) == 1 && y == 2016 && m == 12 && d == 14 ); //this needs to pass
}

我有一个问题,我的“人类可读”函数没有打印我需要的年、月和日。当我打印“buf”变量时,它会正确返回日期,但我需要三个单独变量中的日期,以便我可以从“prevFullMoon”函数传递它们。

如果您在代码中阅读了我的 cmets,您应该了解正在发生的事情以及我想要实现的目标。

我在结构和指针方面很迷茫,因此感谢任何帮助。

附言。在这个线程中,我主要想知道为什么我的时间转换不起作用,但如果您愿意帮助我解决指针并传递 prevY、prevM 和 prevD,我将不胜感激。

谢谢

【问题讨论】:

  • 弄清楚您想要什么以及问题的具体性质的责任在于您,而不是读者。
  • struct tm ts; .... int prevY = &ts.tm_year+1900; 应该发出警告并为您保存关于 SO 的帖子。启用编译器警告并节省时间。
  • 第二个提示:“函数不打印我需要的年、月和日”和ts = *localtime(&now); strftime(... 是两个首先应该检查其返回值的函数。
  • 这甚至不能编译,除非你有一个严重损坏的编译器。 :F 或者默认为 28 岁的 C 标准的东西。编译器需要为此吐出 5 条诊断消息,但我在问题中没有看到它们

标签: c function time


【解决方案1】:

可能还有更多问题,因为您没有展示validDate 的实现,但开始修复这些问题并添加到地址:

int prevY = &ts.tm_year+1900;
int prevM = &ts.tm_mon+1;
int prevD = &ts.tm_mday;

应该是

int prevY = ts.tm_year+1900;
int prevM = ts.tm_mon+1;
int prevD = ts.tm_mday;

【讨论】:

  • 是的,这行得通。这只是表明我还有很多东西要学,这是一个愚蠢的错误。非常感谢。 PS。 validDate 也有点无聊,但那是另一回事。 (大部分都有效,只是检测日期是否正确是不正确的)。但无论如何,我希望能弄明白(或另辟蹊径)。
猜你喜欢
  • 2012-10-14
  • 2016-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多