Получение количества секунд локального временис 1970 г
От: dandare1981  
Дата: 09.04.09 10:32
Оценка:
Добрый день!

Есть задача получение количества секунд в локальном времени (с учетом часового пояса и перехода на летнее/зимнее время), прошедших с 1 января 1970 г. (UNIX TimeStamp).
Возможная реализация c/c++, WinApi, MFC.
Есть ли что-то стандартное? Или нужно писать алгоритм самому (писать начал, всю голову сломал).

Заранее, спасибо!
Re: Получение количества секунд локального временис 1970 г
От: рыбак  
Дата: 09.04.09 10:45
Оценка:
Здравствуйте, dandare1981, Вы писали:

D>Добрый день!


D>Есть задача получение количества секунд в локальном времени (с учетом часового пояса и перехода на летнее/зимнее время), прошедших с 1 января 1970 г. (UNIX TimeStamp).

D>Возможная реализация c/c++, WinApi, MFC.
D>Есть ли что-то стандартное? Или нужно писать алгоритм самому (писать начал, всю голову сломал).

D>Заранее, спасибо!


GetLocalTime -> SystemTimeToFileTime -> и сдвиг 1601 -> 1970
Re: Получение количества секунд локального временис 1970 г
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 09.04.09 10:47
Оценка:
Здравствуйте, dandare1981, Вы писали:

D>Есть задача получение количества секунд в локальном времени (с учетом часового пояса и перехода на летнее/зимнее время), прошедших с 1 января 1970 г. (UNIX TimeStamp).


число секунд, прошедших с 1 января 1970 г не зависит от часового пояса и летнего времени — это time()
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Re[2]: Получение количества секунд локального временис 1970
От: dandare1981  
Дата: 09.04.09 11:05
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

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


D>>Есть задача получение количества секунд в локальном времени (с учетом часового пояса и перехода на летнее/зимнее время), прошедших с 1 января 1970 г. (UNIX TimeStamp).


OE>число секунд, прошедших с 1 января 1970 г не зависит от часового пояса и летнего времени — это time()


Забыл добавить, что в винде отключена опция "Автоматический перевод на летнее/зимнее время".
В моем случае железка возвращает количество секунд прошедших от 1970 года по локальному времени.
Про time() знаю...
Re[2]: Получение количества секунд локального временис 1970
От: dandare1981  
Дата: 09.04.09 11:07
Оценка:
Здравствуйте, рыбак, Вы писали:

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


D>>Добрый день!


D>>Есть задача получение количества секунд в локальном времени (с учетом часового пояса и перехода на летнее/зимнее время), прошедших с 1 января 1970 г. (UNIX TimeStamp).

D>>Возможная реализация c/c++, WinApi, MFC.
D>>Есть ли что-то стандартное? Или нужно писать алгоритм самому (писать начал, всю голову сломал).

D>>Заранее, спасибо!


Р>GetLocalTime -> SystemTimeToFileTime -> и сдвиг 1601 -> 1970



Забыл добавить, что в винде отключена опция "Автоматический перевод на летнее/зимнее время".

Можно подробнее со сдвигом?
Re[3]: Получение количества секунд локального временис 1970
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 09.04.09 12:04
Оценка:
Здравствуйте, dandare1981, Вы писали:

D>>>Есть задача получение количества секунд в локальном времени (с учетом часового пояса и перехода на летнее/зимнее время), прошедших с 1 января 1970 г. (UNIX TimeStamp).


OE>>число секунд, прошедших с 1 января 1970 г не зависит от часового пояса и летнего времени — это time()


D>Забыл добавить, что в винде отключена опция "Автоматический перевод на летнее/зимнее время".

D>В моем случае железка возвращает количество секунд прошедших от 1970 года по локальному времени.

еще раз — число секунд оно и есть число секунд и не зависит от того крутят или не крутят время с летнего на зимнее и обратно

D>Про time() знаю...


ну и?
... << RSDN@Home 1.2.0 alpha 4 rev. 0>>
Re[2]: Получение количества секунд локального временис 1970
От: dandare1981  
Дата: 10.04.09 06:36
Оценка:
Здравствуйте, рыбак, Вы писали:

Р>GetLocalTime -> SystemTimeToFileTime -> и сдвиг 1601 -> 1970



Спасибо, решение оказалось верным! То, что мне было нужно.


Вот получившийся код:



SYSTEMTIME nowsystime;
GetLocalTime(&nowsystime);
ULONGLONG nowsecnds = SYTEMTIMEToSeconds(nowsystime);

...

SYSTEMTIME unixtime;
unixtime.wYear = 1970;
unixtime.wMonth = 1;
unixtime.wDay = 1;
unixtime.wHour = 0;
unixtime.wMinute = 0;
unixtime.wSecond = 0;
unixtime.wMilliseconds = 0;
ULONGLONG unixsecnds = SYTEMTIMEToSeconds(unixtime);

...

ULONGLONG SYTEMTIMEToSeconds(SYSTEMTIME _systime)
{
    FILETIME fltime;
    SystemTimeToFileTime(&_systime, &fltime);
    ULARGE_INTEGER sec;
    sec.HighPart = fltime.dwHighDateTime;
    sec.LowPart = fltime.dwLowDateTime;
    return sec.QuadPart/1E7;
}
Re[4]: Получение количества секунд локального временис 1970
От: Roman Odaisky Украина  
Дата: 10.04.09 08:39
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

OE>еще раз — число секунд оно и есть число секунд и не зависит от того крутят или не крутят время с летнего на зимнее и обратно


Ты это винде скажи. Она же считает, будто системные часы показывают местное время. Например, сколько прошло секунд с начала Эпохи, если часы показывают 01:30:00 25.10.2009 мск (показания, которые имеют место дважды в году)?
До последнего не верил в пирамиду Лебедева.
Re[5]: Получение количества секунд локального временис 1970
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 10.04.09 09:43
Оценка: 1 (1)
Здравствуйте, Roman Odaisky, Вы писали:

OE>>еще раз — число секунд оно и есть число секунд и не зависит от того крутят или не крутят время с летнего на зимнее и обратно


RO>Ты это винде скажи. Она же считает, будто системные часы показывают местное время. Например, сколько прошло секунд с начала Эпохи, если часы показывают 01:30:00 25.10.2009 мск (показания, которые имеют место дважды в году)?


винда все прекрасно знает (слева — локальное уральское время, справа — time() (программка на VC9)) :

2009-10-25 02:59:33,612    1256417973
2009-10-25 02:59:44,741    1256417984
2009-10-25 02:59:56,998    1256417996
2009-10-25 02:00:03,525    1256418003
2009-10-25 02:00:10,867    1256418010
2009-10-25 02:30:33,702    1256419833
2009-10-25 02:45:57,437    1256420757
2009-10-25 02:59:08,843    1256421548
2009-10-25 02:59:27,265    1256421567
2009-10-25 02:59:33,406    1256421573
2009-10-25 02:59:51,281    1256421591
2009-10-25 02:59:58,937    1256421598
2009-10-25 03:00:02,406    1256421602
2009-10-25 03:00:06,578    1256421606
2009-10-25 03:00:37,328    1256421637


заметь, что несмотря на скачки локального времени, time() совершенно верно только нарастает, число секунд, прошедшее с 1 января 1970 не может начать уменьшаться.

з.ы. только не надо тестироваться на CBuilder5, там действительно совершенно левая time(), которая прыгает вместе с локальным временем.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.