Проблема 2038 года
От: BishopMorton Россия  
Дата: 28.02.08 13:37
Оценка:
Привет всем!

С какого фига Microsoft определили по дефолту time_t как 64-bit integer
http://msdn2.microsoft.com/en-us/library/3b2e7499.aspx

Натолкнулся на эти грабли при переводе старого проекта на MSVS2005

Я все понимаю, проблема 2038 года, и все такое, но до нее еще 30 лет !!!
Сейчас еще полно кода, для которого 64битные time_t это откровение, так спрашивается какого фига так делать по дефолту?

И ATL CTime переписали... блин

ЗЫ
Кто как решил для себя решать проблему 2038 года?

ЗЫЗЫ
Я смотрю народ активно уже стал домены занимать

WBR,
Anton
When money talks... nobody checks the grammar.
Re: Проблема 2038 года
От: Cyberax Марс  
Дата: 28.02.08 13:44
Оценка: 2 (1) +1
Здравствуйте, BishopMorton, Вы писали:

BM>Я все понимаю, проблема 2038 года, и все такое, но до нее еще 30 лет !!!

Уже всего 20. Пора бы начать думать.

PS: последствие Y2k38 я уже видел — у человека в банке неправильно рассчитывался кредит на 20 лет
Sapienti sat!
Re: Проблема 2038 года
От: MasterZiv СССР  
Дата: 28.02.08 14:35
Оценка:
BishopMorton пишет:
> С какого фига Microsoft определили *по дефолту* time_t как 64-bit integer
> http://msdn2.microsoft.com/en-us/library/3b2e7499.aspx

Патамушта микрасофт !

> Натолкнулся на эти грабли при переводе старого проекта на MSVS2005

Гы ... и ты тоже ...
USE_32BIT_TIME_T тебе в помощь...
MySQL кстати только из-за этого на 2005 студии не компилится.

> Кто как решил для себя решать проблему 2038 года?


/DUSE_32BIT_TIME_T
sleep( 1000*3600*24*365*20 );
Posted via RSDN NNTP Server 2.1 beta
Re[2]: Проблема 2038 года
От: BishopMorton Россия  
Дата: 28.02.08 14:38
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>USE_32BIT_TIME_T тебе в помощь...


Его и заюзал...
Только вот с ATL CTime все хуже , там просто явно 64битная версия захардкожена, никаких тебе дефайнов...

жгут короче мелкомягкие
When money talks... nobody checks the grammar.
Re: Проблема 2038 года
От: AleksandrN Россия  
Дата: 28.02.08 15:17
Оценка:
Здравствуйте, BishopMorton, Вы писали:

BM>С какого фига Microsoft определили по дефолту time_t как 64-bit integer

BM>http://msdn2.microsoft.com/en-us/library/3b2e7499.aspx

Вроде-бы, разрядность time_t всегда равна разрядности системы (и в Windows и в UNIX).
Re[2]: Проблема 2038 года
От: MasterZiv СССР  
Дата: 28.02.08 15:58
Оценка:
AleksandrN пишет:
> Вроде-бы, разрядность time_t всегда равна разрядности системы (и в
> Windows и в UNIX).

1) Разрядность системы — 32 бита. Т.е. это — WinXP 32. time_t при этом — 64
2) Все старые приложения тоже так думали, и писали соответственно
time_t tval;
sometime_func ( (int) tval );

Оно понятно, что неправильно, но что ж делать -то ...
Posted via RSDN NNTP Server 2.1 beta
Re[2]: Проблема 2038 года
От: PPA Россия http://flylinkdc.blogspot.com/
Дата: 29.02.08 05:56
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>PS: последствие Y2k38 я уже видел — у человека в банке неправильно рассчитывался кредит на 20 лет


А в каком банке денюжку считают на С++?
Re: Проблема 2038 года
От: pvirk Россия  
Дата: 29.02.08 09:28
Оценка:
Здравствуйте, BishopMorton, Вы писали:

BM>Кто как решил для себя решать проблему 2038 года?


boost::date_time и никаких проблем.
Re[2]: Проблема 2038 года
От: Michael7 Россия  
Дата: 02.03.08 18:45
Оценка:
Здравствуйте, Cyberax, Вы писали:

BM>>Я все понимаю, проблема 2038 года, и все такое, но до нее еще 30 лет !!!

C>Уже всего 20. Пора бы начать думать.

2038-2008=30
Re[3]: Проблема 2038 года
От: BishopMorton Россия  
Дата: 03.03.08 00:34
Оценка:
Здравствуйте, Michael7, Вы писали:

M>Здравствуйте, Cyberax, Вы писали:


BM>>>Я все понимаю, проблема 2038 года, и все такое, но до нее еще 30 лет !!!

C>>Уже всего 20. Пора бы начать думать.

M>2038-2008=30


Наверное 20 — это об этой проблеме: http://korrespondent.net/tech/168415

Ученые Главной (Пулковской) обсерватории РАН не исключают возможность столкновения астероида с Землей в 2035 году, однако точнее определить вероятность возникновения катастрофы смогут лишь в 2028 году.


2Cyberax
В целом проблема, конечно, важная, но у редких продуктов срок саппорта больше 30 лет... Могли бы в MS уж при конвертации старого кода какую-нибудь макруху взводить, чтобы не использовались 64битные числа для хранения веремени, ну и ворнинг соответствующий. Из-за этого неявного перехода очень много багов может появится и без 2038 года

WBR,
Anton
When money talks... nobody checks the grammar.
Re[2]: Проблема 2038 года
От: BishopMorton Россия  
Дата: 03.03.08 00:52
Оценка:
Здравствуйте, pvirk, Вы писали:

P>Здравствуйте, BishopMorton, Вы писали:


BM>>Кто как решил для себя решать проблему 2038 года?


P>boost::date_time и никаких проблем.


А с какой версией нет проблем?

http://www.boost.org/doc/html/date_time/gregorian.html#date_construct_from_clock
Internally boost::gregorian::date is stored as a 32 bit integer type.

У меня только boost_1_31_0 завалялся, дык там вызовы localtime... и тп
ничего 64 битного для времени не нашел...

WBR,
Anton
When money talks... nobody checks the grammar.
Re[3]: Проблема 2038 года
От: pvirk Россия  
Дата: 03.03.08 12:10
Оценка: 5 (1)
Здравствуйте, BishopMorton, Вы писали:

P>>boost::date_time и никаких проблем.


BM>А с какой версией нет проблем?


BM>http://www.boost.org/doc/html/date_time/gregorian.html#date_construct_from_clock

BM>Internally boost::gregorian::date is stored as a 32 bit integer type.

BM>У меня только boost_1_31_0 завалялся, дык там вызовы localtime... и тп

BM>ничего 64 битного для времени не нашел...

Вот же из документации

The current implementation supports dates in the range 1400-Jan-01 to 9999-Dec-31

Конструктор типа boost::gregorian::date(9999,1,1) работает правильно.
Если надо получить секунды от 1970 года — заполняем tm нужными данными, юзаем boost::posix_time::ptime_from_tm(tm&) и отнимаем от него boost::gregorian::date(1970,1,1) — получаем boost::posix_time::time_duration td — в нём часы, минуты и секунды от 1.1.1970.
Если надо перевести секунды в дату > 2300года, то примерно так
     long long secs = 1000000000000;
     long long hours = secs/3600;
     date d = ptime(date(1970,1,1),time_duration((long)hours, 0 ,(long)(secs - 3600*hours))).date();

В результате в d — нужная дата.
boost 1.34, но думаю в остальных также.
Конечно всё несколько запутано у них, это да.
Re[2]: Проблема 2038 года
От: BishopMorton Россия  
Дата: 04.03.08 13:35
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>BishopMorton пишет:

>> С какого фига Microsoft определили *по дефолту* time_t как 64-bit integer
>> http://msdn2.microsoft.com/en-us/library/3b2e7499.aspx

MZ>Патамушта микрасофт !


>> Натолкнулся на эти грабли при переводе старого проекта на MSVS2005

MZ>Гы ... и ты тоже ...
MZ>USE_32BIT_TIME_T тебе в помощь...
MZ>MySQL кстати только из-за этого на 2005 студии не компилится.

>> Кто как решил для себя решать проблему 2038 года?


MZ>/DUSE_32BIT_TIME_T

MZ>sleep( 1000*3600*24*365*20 );

Обнаружили тут прикольный баг в MFC (mfc80.dll)

Если засетить USE_32BIT_TIME_T в MFC проекте, то ::HasFont функция падает (внутри mfc) с Access Violation в Release

Если убрать USE_32BIT_TIME_T то все пучком... такие вот дела
When money talks... nobody checks the grammar.
Re[3]: Проблема 2038 года
От: MasterZiv СССР  
Дата: 04.03.08 17:08
Оценка:
BishopMorton пишет:
> Обнаружили тут прикольный баг в MFC (mfc80.dll)
>
> Если засетить USE_32BIT_TIME_T в MFC проекте, то ::HasFont функция
> падает (внутри mfc) с Access Violation в Release
>
> Если убрать USE_32BIT_TIME_T то все пучком... такие вот дела

Так это не баг, это ж вам надо было MFC пересобрать с USE_32BIT_TIME_T
сначала, а потом с ней уже работать.
Posted via RSDN NNTP Server 2.1 beta
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.