【问题标题】:incorrect epoch unix time value for larger year (2048)较大年份的不正确纪元 unix 时间值 (2048)
【发布时间】:2013-01-28 19:14:34
【问题描述】:

我需要获取输入日期和时间的纪元时间,但是当我输入 2048(年)时,我得到的值非常大,“18446744073709551615”,这应该是不正确的..

当我输入像 2012(年)、2015(年)这样的日期时,它的纪元值是正确的,我需要为 2048(年)做任何更改

time_t get_unix_time(int,int,int,int,int,int,int);
int main()
{
unsigned long long m_process_date;
m_process_date = get_unix_time (12,31,2048,23,59,58,-1);
std::cout<<"\n m_process_date:"<< m_process_date<<std::endl;
return 1;
}


time_t get_unix_time(   int         month,
                        int         day,
                        int         year,
                        int         hour,
                        int         minute,
                        int         second,
                        int         dst )
{
    tm          ts;

    ts.tm_mon = month - 1;
    ts.tm_mday = day;

    if( year < 100 )
        ts.tm_year = year + 100;
    else
        ts.tm_year = year - 1900;

    ts.tm_hour = hour;
    ts.tm_min = minute;
    ts.tm_sec = second;
    ts.tm_isdst = dst;

    return mktime( &ts );
}

【问题讨论】:

  • 从 1970 年开始,时间通常仍以带符号的 32 位秒数来衡量。这意味着 2038 年的时间将溢出。参见例如the year 2038 problem.
  • ...我正在打字。 :)
  • 您的平台是否支持 mktime64(mktime 的 64 位版本)? stackoverflow.com/questions/7914368/…
  • 如果您有选择,编译为 64 位。较新的 64 位运行时将 time_t 值存储为 64 位无符号整数。

标签: c++ unix


【解决方案1】:

标准 Unix 时间存储在有符号整数中。这是正常的 32 位,但可能因实现而异(一些新的实现将 time_t 存储为带符号的 64 位 int)。

因此,对于 32 位有符号整数,这意味着最大可表示日期为 Jan 19, 2038

【讨论】:

  • 如果使用 64 位表示,那么最大日期可以接近 3000 亿年。
  • 问题是有些机器是 32 位的,有些是 64 位的。我需要为 32 位编码,然后也将其释放为 64 位
猜你喜欢
  • 2019-02-16
  • 1970-01-01
  • 1970-01-01
  • 2017-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-01
  • 2012-01-30
相关资源
最近更新 更多