【问题标题】:time function in C always displays "Wed Dec 31 23:59:59 1969"C 中的时间函数始终显示“Wed Dec 31 23:59:59 1969”
【发布时间】:2015-12-26 07:04:04
【问题描述】:

我需要为我的申请记录当前日期和时间。 我已经用C编写了代码。我已附上代码

#include <stdio.h>
#include <time.h>

int main()
{   time_t t;


     while(1)
     { time(&t);
       printf("Today's date and time : %s",ctime(&t));   
     } 

}

输出是

Today's date and time : Wed Dec 31 23:59:59 1969
Today's date and time : Wed Dec 31 23:59:59 1969
Today's date and time : Wed Dec 31 23:59:59 1969
Today's date and time : Wed Dec 31 23:59:59 1969

自 UNIX 时间开始以来,时间没有得到更新。 我在另一台计算机上运行了相同的程序,它运行得很好。 为什么我的电脑会出现此错误,我该如何解决?

谢谢

任何帮助表示赞赏。

编辑:代码中有一个错误,我纠正了它,以便在while循环中更新时间

【问题讨论】:

  • 你检查errno了吗?
  • 另外,您的计算机时钟中设置的日期是什么?
  • 您需要在每次需要时间时致电time()ctime(&amp;t) 将继续打印调用 time() 时的时间。因此,您的代码将产生相同的输出。永远。至于为什么要打印那个特定的时间,该值与t 具有值-1 一致,该值被保留以指示错误。检查您的系统时钟设置是否正确(例如使用适当的系统实用程序)。并检查 CMOS 电池(用于保持系统时钟滴答作响,尤其是在计算机断电时)是否没电。如果是平的,请更换它。
  • 您能否描述一下您正在运行的硬件和操作系统?你能以其他方式检查系统时钟吗(不使用 C 程序)?
  • 一个好的经验法则是初始化大多数局部变量。所以你也许应该声明time_t t=0;

标签: c time unix-timestamp


【解决方案1】:

time 返回一个错误,请参阅docs

出错时返回((time_t) -1),并正确设置errno。

当然,相对于 EPOCH 时间的 -1 是正在打印的日期。但是,您没有存储或使用time 的返回值,因此这意味着t 本身以某种方式为-1。您是否发布了您正在使用的确切代码?

因此,由于 time 返回 -1 表示您有错误,因此您必须检查 errno 以查看实际错误是什么。然而,显然time 应该返回的唯一错误是EFAULT,在这种情况下意味着:

t 指向您可访问的地址空间之外。

更新:尝试这样做,看看会发生什么:

time_t t = time(NULL);

没有太多理由按照你的方式去做。

如果这确实是您逐字使用的代码,那么我无法解释您如何在 t 中获得 -1,因为 -1 将由 time() 返回,但您不是以任何方式访问返回值。这意味着t 必须已经是-1。鉴于它未初始化,我认为这是可能的,但我不确定t 的未初始化内存是否可能在每个程序运行时始终为-1。有人知道吗?尽管如此,它要求&amp;t在某种程度上是一个无效地址,以触发EFAULT,这将使t的值-1保持不变。

【讨论】:

  • 关于but you're not accessing the return value in any way.doc表示如果t不为NULL,返回值也存储在t指向的内存中。
  • 确实如此,但time() 将其设置为 -1 的唯一原因是 errno 是 EFAULT,这意味着 t 位于“可访问地址空间之外”,这大概会意味着time() 无法访问t,更不用说将其值设置为-1。这就是为什么我想知道在调用time()之前是否可能t被设置为-1,不知何故。
  • This is why I'm wondering if perhaps t was set to -1 before the call to time(), somehow。我想情况并非如此。但是,不知道;)
  • 是的,我们需要来自 OP 的更多反馈,但他们没有沟通。
【解决方案2】:

您没有提到您使用的是什么操作系统。 所以不清楚你是否有 RTC(实时时钟)。

值得注意的是:

非 PC 系统,例如围绕片上系统构建的嵌入式系统 处理器,使用其他实现。他们通常不会提供 与 PC/AT 中的 RTC 功能相同。

根据文档 EFAULT 发生在:

t 点在您可访问的地址空间之外

但是,我不确定这何时会发生。

事实上 EFAULT 被定义为 here

#define EFAULT          14      /* Bad address */


您的代码一开始给我的结果与您的相似。 但是这个对我有用:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{

    time_t *t;
    t=(time_t*)malloc(sizeof(*t));
    time(t);
    printf("Today's date and time : %s",ctime(t));
    free(t); //Clean up the mess we've created
    return 0;
}

但我不知道为什么。

参考:RTC

【讨论】:

  • &amp;t 不能在地址空间之外
  • @anand-krish:你能试试这个。这可能不是一个解决方案,但我很想知道输出。
  • @M.M:我可能同意。我发现&amp;t 没有理由在地址空间之外。该操作的程序最初给了我与他提到的类似的输出。但这一次给了我正确的时间..
  • @anand-krish :如果您使用的是 linux 机器,您可以尝试以 root 身份运行您的代码。
猜你喜欢
  • 2020-06-15
  • 1970-01-01
  • 1970-01-01
  • 2011-01-26
  • 2016-05-03
  • 2013-10-19
  • 2021-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多