我使用tm / mktime是否错误,是否没有解决方法?

卡姆登·纳兹特(Camden Narzt)

我认为以下程序应将每年的第一天从1AD到1970的秒数输出到1970,time_t并在其上进行编译的系统上的大小CHAR_BIT是宏,因此我认为您不能只复制已编译的可执行文件并假设它是正确的,尽管实际上现在所有东西都使用8位char)。

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

void do_time(int year)
{
  time_t utc;
  struct tm tp;

  memset(&tp, 0, sizeof(tp));

  tp.tm_sec = 0;
  tp.tm_min = 0;
  tp.tm_hour = 0;
  tp.tm_mday = 1;
  tp.tm_mon = 0;
  tp.tm_year = year - 1900;
  tp.tm_wday = 1;
  tp.tm_yday = 0;
  tp.tm_isdst = -1;

  printf("%d %ld\n",year, mktime(&tp));
}

int main(){
  printf("time_t is %lu bits\n",sizeof(time_t)*CHAR_BIT);
  for (int i = 1; i<1971; i++)
    do_time(i);
  exit(0);
}

但是,在OS X(10.11.3 15D21)上,尽管time_t具有64位签名,但只能在> = 1902年使用我可能理解苹果的程序员是否懒惰并且在1970年之前没有任何支持,但是正确的行为可以追溯到1902年,然后停下来看起来更像是我的错误。

丹尼尔·戴

咨询C标准:

范围和次精度所能表述中clock_ttime_t是实现定义。[..]

[N1570§7.27.1/ 4](强调我的)

再往下看,关于mktime

mktime函数返回指定的日历时间,该时间编码为type的值time_t如果无法表示日历时间,则该函数返回值(time_t)(-1)

[N1570§7.27.2.3/ 3]

因此,只要的返回值mktime(time_t)(-1)在不起作用的年份中,您就可以自己承担责任


实际上,IMO对所有这些标准都保持沉默:

[..] int tm_year; // years since 1900[..]

[N1570§7.27.1/ 4]

这可能意味着自1900年以来的(正)年,但是为什么要使用带符号整数。


附带说明:在我的系统(Linux 3.14.40 x86_64 glibc-2.21)上,我得到...

time_t is 64 bits
1 -62135600008
...
1969 -31539600
1970 -3600

考虑到周围的工作:您当然可以查看正在执行所需操作的libc实现,并尝试使用其代码(如果您需要遵守的任何许可证都是可行的)。这是我的系统使用那个。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我尝试的Hive插入是否有解决方法

强制使用mapply是否有解决方法

ffmpeg的-画图字体字体颜色alpha有没有解决方法不能使用边框

是否有解决方法可以通过泛型类使用静态方法?

是否有解决Safari错误的解决方法,该错误通过使用具有复杂边框半径的border-bottom来构建伪像

在多个龟类中使用>运算符是否有解决方法?

无法使用第二个FTP帐户进行文件访问,是否有解决方法?

使用foreach循环遍历arraylist而不使实例成为最终实例时,是否有解决方法?

我看到了类似的问题,但仍然没有解决我的问题,所以我的问题是如何解决以下错误?

为什么我的代码没有解决求步数计算数的问题?

webpack:使用2个入口文件时,两个文件都包含相同的CSS-是否有解决方法?

使用Swift进行可可打印:“任何”打印机设置的页边距/页面大小都不规则,是否有解决方法?

使用静态IP时Internet无法正常工作。当前没有解决方案

我是否必须填充tm_gmtoff和tm_zone?并且,我应该使用哪个函数mktime或gmtime在C中获取无时区的datetime?

我的 calc() 使用 vw 和整数的组合计算字体大小没有解决

当数据提取单元格包含公式时,SPARKLINE错误。有没有解决方法?

为什么我的窗口滚动事件根本没有触发。其他答案没有解决

是否有在我的 UWP 应用中使用 Google Books API 的解决方法

GCP我无法在VM实例上访问jupyter服务器。(stackoverflow中没有解决方案)

Python 中的替换函数不起作用(其他答案没有解决我的问题)

这里没有解决方案适用于我的“未找到‘PDO’类”。

为什么在使用 node 和 redis 时我的承诺没有解决?我的数组返回第一次迭代而不是等待整个代码运行

已指定命名参数“child”的参数。我已经尝试过很多次使用 column 但它没有解决我的问题

使用Windows从ftp下载时是否有解决“:”(冒号)的方法

如何使用正则表达式获取 URL(查看了 SO 的一些答案,但这并没有解决我的问题)?

了解没有“MedianIFs”功能,是否有解决方法?

没有错误,但 findviewbyid 没有解决

组成和标记接口是否有解决方法?

npm publish -f是否有解决方法