Sunday, 4 May 2014

Y2038 - Year 2038 problem

hay còn gọi là Unix Millennium Bug.

Cho những người thích đọc wiki

http://en.wikipedia.org/wiki/Year_2038_problem

Cho fan python

In [8]: import datetime
In [10]: datetime.datetime.fromtimestamp((2**32 /2 - 2))
Out[10]: datetime.datetime(2038, 1, 19, 10, 14, 6)
Kết quả trên là 10 giờ do sử dụng GMT+7
Để lấy kết quả UTC:
In [31]: import time

In [32]: time.gmtime(2**32/2-2)
Out[32]: time.struct_time(tm_year=2038, tm_mon=1, tm_mday=19, tm_hour=3, tm_min=14, tm_sec=6, tm_wday=1, tm_yday=19, tm_isdst=0)


năm 2038 có gì hot?

để hiểu rõ vấn đề này cần có chút hiểu biết về 1 kiểu dữ liệu trong C được gọi là  signed 32-bit integer 
kiểu dữ liệu này chỉ có thể biểu diễn giá trị dương lớn nhất là 2**32 / 2 - 2 = 2147483646
(signed - có dấu âm/dương, tức nó biểu diễn được từ - (2 ** 32 /2 )đến 0  đến 2 ** 32 - 2 )



Vậy, đến năm 2038, ngày 19 tháng 1, nếu OS nào không xử lý vấn đề này thì tòan bộ giá trị dùng kiểu dữ liệu time_t sẽ bị chuyển về năm 1901. Và "sự cố" này sẽ gây ra hậu quả nghiêm trọng hơn sự cố Y2K rất nhiều lần.


2 OS đã đưa ra bản fix cho vấn đề này là NetBSD và OpenBSD 5.5
, chuyển từ time_t 32 bits sang dùng kiểu dữ liệu time_t 64 bits . Các OS based Linux hiện vẫn chưa đưa ra bản fix nào (công việc này không phải đơn giản, bởi sẽ cần sửa rất nhiều chương trình sử dụng time_t)