摘自cppref:
std::time_t
32 位有符号整数的实现(许多历史实现)将在 2038 年失败。
但是,文档没有说明如何检测当前实现是否是 2038 安全的。所以,我的问题是:
如果在 C++ 中,是否保证 2038 安全 sizeof(std::time_t) == sizeof(std::uint64_t)
?
Windows上的官方Python 2.5是使用Visual Studio.Net 2003构建的,它使用32位time_t.因此,当年份> 2038年时,它只是例外.
虽然这在Python 2.6中已经修复(使用VS2008将time_t更改为64位),但我想使用2.5,因为已经为它编译了许多模块.
所以这是我的问题 - 是否有任何解决方案可以轻松让我的程序处理年份> 2038仍然使用官方Python 2.5?例如,一些预先制作的图书馆喜欢"time64"
或"长期"等...
请不要告诉我升级到2.6+或忘记错误 - 我有理由需要让它工作,这就是我在这里发布问题的原因.
我有一些代码将一些存储为字符串的时间戳转换为datetime对象,并注意到今天转换日期时int时间戳值大于max int的异常.
datetime.datetime.fromtimestamp(2147570047)
Run Code Online (Sandbox Code Playgroud)
比如给我
ValueError: timestamp out of range for platform time_t
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个问题?假设我想继续使用32位python(运行2.7.2)
我注意到我可以将max int转换为datetime对象,然后使用timedeltas添加任何额外的东西,但我想不出在实践中这样做的特别有效或好的方法.我可以将这些2038多个时间戳转换为datetime对象的好方法是什么?
我试图在 MySQL 中存储一个date()字段,一个连续的日期到2037 年。
例如: 2065-12-01
问题是该字段正在返回: 1969-12-31
在 DB 上记录这些值的正确方法是什么?我应该使用VARCHAR吗?
我date
像这样计算字段的值:
$future_date = date('Y-m-d', strtotime("+$number_years_to_add years"));
Run Code Online (Sandbox Code Playgroud) 我正在 Unix 中进行高级编程的练习并遇到以下问题:
如果日历时间存储为有符号的 32 位整数,它会在哪一年溢出?
正符号整数 = 2147483647
在下面的计算中,我没有考虑闰年:
((((2147483647 / 60sec) /60min)/24)/365) = 68.1yrs
Run Code Online (Sandbox Code Playgroud)
这是一种幼稚的做法。我怎样才能专业地解决这个问题?
堆栈成员之前提出的以下解决方案对打印年份非常有帮助。
int epoch_time = INT_MAX;
struct tm * timeinfo;
time_t epoch_time_as_time_t = epoch_time;
timeinfo = localtime(&epoch_time_as_time_t);
printf("2] overflow date: %s", asctime(timeinfo));
Run Code Online (Sandbox Code Playgroud) 32位ruby 1.9.2p290(我必须使用),似乎很难在当前时间内添加25(但不是24!)年.
now = Time.now
more_time = (24*365*24*60*60)
puts "more_time.class = #{more_time.class}"
later = now + more_time
now = Time.now
more_time = (25*365*24*60*60)
puts "more_time.class = #{more_time.class}"
later = now + more_time
Run Code Online (Sandbox Code Playgroud)
生产:
more_time.class = Fixnum
more_time.class = Fixnum
ruby_time.rb:11:in'+':时间+ 788400000.000000超出ruby_time.rb的时间范围(RangeError):11
我遇到了2038年的问题吗?64位ruby 1.9.2-p290我没有这个问题.
使用旧版本的EPrints软件,我有这个函数 EPrints :: Time :: datestring_to_timet返回自1970年以来的整数秒
######################################################################
=pod
=item $xhtml = EPrints::Time::datestring_to_timet( $handle, $datevalue )
Returns an interger number of seconds since 1970-01-01:00:00
$datevalue - in the format YYYY-MM-DDTHH:MM:SSZ
=cut
######################################################################
sub datestring_to_timet
{
my( $session, $datevalue, $short ) = @_;
my( $year,$mon,$day,$hour,$min,$sec ) = split /[- :TZ]/, $datevalue;
my $t = timegm_nocheck $sec||0,$min||0,$hour,$day,$mon-1,$year-1900;
return $t;
}
Run Code Online (Sandbox Code Playgroud)
如果使用未来一年,我得到一个负数:
print EPrints::Time::datestring_to_timet(undef, "3017-9-20T12:00:00Z");
Run Code Online (Sandbox Code Playgroud)
结果:
-26895412800
Run Code Online (Sandbox Code Playgroud)
这有什么不对?
我试图使用下面的perl命令将纪元时间转换为可读的本地时间:
bash-3.2$ perl -le print\ scalar\ localtime\ 32503651200
Thu Mar 9 19:13:52 1911
Run Code Online (Sandbox Code Playgroud)
在2038年之后可以正确转换,但是对于年份数大于2038年我无法获得预期的结果.
请告知如何解决.谢谢.