标签: year2038

PHP和mySQL:2038年错误:它是什么?怎么解决?

我正在考虑使用TIMESTAMP存储日期+时间,但我读到它有2038年的限制.我没有大量提出我的问题,而是倾向于将其分解成小部分,以便新手用户也能轻松理解.所以我的问题:

  1. 2038年的问题究竟是什么?
  2. 它为什么会发生?当它发生时会发生什么?
  3. 我们如何解决它?
  4. 是否有任何可能的替代方案使用它,这不会造成类似的问题?
  5. 当真正发生时,我们可以对使用TIMESTAMP的现有应用程序做些什么来避免所谓的问题?

提前致谢.

php mysql year2038

99
推荐指数
3
解决办法
3万
查看次数

我们该怎么做才能为2038做准备?

我想我今天写的一些软件将在30年内使用.但我也意识到,很多都是基于UNIX传统,即将时间暴露为自1970年以来的秒数.

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

void print(time_t rt) {
    struct tm * t = gmtime(&rt);
    puts(asctime(t));
}

int main() {
    print(0);
    print(time(0));
    print(LONG_MAX);
    print(LONG_MAX+1);
}
Run Code Online (Sandbox Code Playgroud)

执行结果:

  • 1970年1月1日00:00:00
  • 2008年8月30日星期六18:37:08
  • 星期二1月19日3时14分07秒2038
  • 12月13 星期五20:45:52 1901

函数ctime(),gmtime()和localtime()都将一个时间值作为参数,该时间值表示自Epoch(1970年1月1日00:00:00 UTC;参见时间(3))以来的时间(以秒为单位).

我想知道作为程序员在这个领域是否有任何主动做的事情,或者我们是否相信所有软件系统(又称操作系统)将来会如何神奇地升级?

更新看起来确实64位系统是安全的:

import java.util.*;

class TimeTest {
    public static void main(String[] args) {
        print(0);
        print(System.currentTimeMillis());
        print(Long.MAX_VALUE);
        print(Long.MAX_VALUE + 1);
    }

    static void print(long l) {
        System.out.println(new Date(l));
    }
}
Run Code Online (Sandbox Code Playgroud)
  • 12月31日星期三16:00:00太平洋标准时间1969年
  • 2008年8月30日星期六12:02:40 PDT 2008
  • 8月16日星期六23:12:55太平洋标准时间292278994
  • 太阳12月02日08:47:04太平洋标准时间292269055

但那一年292278994呢?

unix maintainability time year2038

60
推荐指数
2
解决办法
6785
查看次数

为什么时间戳限制在2038年?

我刚刚发现,运行日历脚本,PHP中的时间戳限制为2038.这究竟是什么意思?为什么是2038而不是2050或2039?如果时间戳只计算给定日期(1970年)的秒数,为什么限制?

php timestamp year2038

26
推荐指数
2
解决办法
3万
查看次数

2038年嵌入式Linux(32位)解决方案?

在3238嵌入式Linux(ARMLinux)的C代码中处理时间的正确方法是什么,以确保代码在2038年1月19日03:14:07 UTC之后继续正常工作(当有符号的32位time_t溢出时)?鉴于time_t在我必须使用的系统上签名32位,有哪些替代方案?

大量的谷歌搜索没有发现任何实际用途.每个人似乎都认为到那时我们都将使用64位操作系统,但这显然不适用于嵌入式系统.

在我需要使用的系统上,__kernel_time_t定义为a long.这可能意味着64位时间没有内核工具.uClibc的版本是0.9.29.

我不敢相信我是唯一有这个问题的人,我不想重新发明轮子.

c 32-bit uclibc embedded-linux year2038

23
推荐指数
2
解决办法
3294
查看次数

如何在不使用time_t的情况下将std :: chrono :: time_point转换为std :: tm?

我想打印或提取年/月/日值.

我不想用time_t,因为2038年的问题,但我在网上找到的所有例子都使用它来转换time_pointtm.

有没有一种简单的方法可以从time_point转换为tm(最好没有boost)?


就像一个实现timesublibc的将是我的最后一招: http://www.opensource.apple.com/source/Libc/Libc-262/stdtime/localtime.c


编辑:在阅读建议的链接并进行更多研究后,我得出以下结论.

  1. 使用time_t,其长度为64位是可以的(对于大多数用途).
  2. 使用Boost.Date_Time获取可移植代码.

值得注意的是,Boost.Date_Time可以是仅限标头的库.资料来源:http: //www.boost.org/doc/libs/1_53_0/more/getting_started/unix-variants.html#header-only-libraries

c++ year2038 c++11 c++-chrono

15
推荐指数
2
解决办法
1万
查看次数

Java程序员为什么要关心2038年的bug呢?

2038年的Bug已经遍布网络,但这似乎是一个unix问题.这将如何影响Java Date?

java unix date year2038

13
推荐指数
2
解决办法
4703
查看次数

访问PHP中的日期超过2038年

我的理解是,由于PHP使用毫秒表示日期的性质,您无法表示过去2038年的日期.我有一个问题,我想在将来计算日期.数千年之后.

显然我不能使用php日期函数来代表这个日期,因为有限制,但是,我有一些东西在我身边......我想做的就是存储年,月和日.我不关心小时,分钟,秒和毫秒.

我是否正确地认为,如果不包含这些额外信息,我应该能够进一步计算未来,因为我愿意丢弃大量信息.这是目前正在执行此操作的库吗?如果没有,有任何建议如何解决这个问题?

php time timestamp date year2038

13
推荐指数
2
解决办法
2万
查看次数

为什么std :: chrono :: time_point不足以存储struct timespec?

我正在尝试最近的std::chronoapi,我发现在64位Linux体系结构和gcc编译器上time_point,duration类和类无法以最大分辨率(纳秒)处理操作系统的最大时间范围.实际上,似乎这些类的存储是一个64位的整数类型,相比于timespectimeval其内部使用两个64位整数,一个用于秒,一个用于纳秒:

#include <iostream>
#include <chrono>
#include <typeinfo>
#include <time.h>

using namespace std;
using namespace std::chrono;

int main()
{
    cout << sizeof(time_point<nanoseconds>) << endl;                       // 8
    cout << sizeof(time_point<nanoseconds>::duration) << endl;             // 8
    cout << sizeof(time_point<nanoseconds>::duration::rep) << endl;        // 8
    cout << typeid(time_point<nanoseconds>::duration::rep).name() << endl; // l
    cout << sizeof(struct timespec) << endl;                               // 16
    cout << sizeof(struct timeval) << endl;                                // 16
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在64位Windows(MSVC2017)上,情况非常相似:存储类型也是64位整数.在处理稳定(也称为单调)时钟时这不是问题,但存储限制使得不同的API实现不适合存储更大的日期和更宽的时间跨度,从而为类似Y2K的错误创造了基础.这个问题得到了承认吗?是否有更好的实施或API改进的计划?

gcc year2038 visual-c++ c++11 c++-chrono

9
推荐指数
1
解决办法
1184
查看次数

在64位unix PHP上2038之后转换为UTC时出错

我需要在Centos 7.4 64位上使用php(5.4)将日期时间信息从本地时间(gtm + 1)转换为UTC

我尝试了以下程序:

function convertToUtc ($date)
{
  $dateTime = new DateTime ($date, new DateTimeZone('Europe/Rome'));
  $dateTime->setTimezone(new DateTimeZone('UTC'));
  return $dateTime->format('Y-m-d') . 'T' . $dateTime->format('H:i:s') . 'Z';
}
Run Code Online (Sandbox Code Playgroud)

这工作到2038年之后,它错误地计算DST总是返回1小时的偏移量:

2037:一切都好

LOCAL TIME           ->  UTC TIME

2037-03-28 10:12:13  ->  2037-03-28T09:12:13Z   the day before dst change

2037-03-29 10:12:13  ->  2037-03-29T08:12:13Z   the first DST day

2037-10-24 10:12:13  ->  2037-10-24T08:12:13Z   the last DST day

2037-10-25 10:12:13  ->  2037-10-25T09:12:13Z   the day after


2038 : ok until dst change

2038-03-27 10:12:13  ->  2038-03-27T09:12:13Z   OK

2038-03-28 10:12:13 …
Run Code Online (Sandbox Code Playgroud)

php datetime utc year2038 tzdata

8
推荐指数
1
解决办法
128
查看次数

时间(); 2038年后?

time();在2038年之后,php功能是否可以正常运行?

php time year2038

7
推荐指数
1
解决办法
1215
查看次数