res2001
Silver Member | Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору Код перевода даты/времени в секунды от начала эпохи и назад. Дата время задается в переменных YEAR,MONTH,DAY,HOUR,MIN,SEC, сейчас берется текущая дата/время. Начало эпохи задается в YEARBEGIN. Процедура dat2timestamp - вычисляет секунды от начала эпохи, timestamp2date - обратная операция. Код: @ECHO OFF SetLocal EnableDelayedExpansion set "YEARBEGIN=1970" set "YEAR=%date:~6,4%" set /a "DAY=1%date:~,2%-100" set /a "MONTH=1%date:~3,2%-100" rem set "DAY=42" rem set "MONTH=10" rem set "YEAR=1991" set /a "HOUR=1%time:~,2%-100" set /a "MIN=1%time:~3,2%-100" set /a "SEC=1%time:~6,2%-100" set /a "TOTALSEC=0" rem Инициализация таблиц длин месяцев rem 1 2 3 4 5 6 7 8 9 10 11 12 set "regul=31 28 31 30 31 30 31 31 30 31 30 31" set "visok=31 29 31 30 31 30 31 31 30 31 30 31" echo %DAY%.%MONTH%.%YEAR% %HOUR%:%MIN%:%SEC% call:date2timestamp %YEAR% %MONTH% %DAY% %HOUR% %MIN% %SEC% set TOTALSEC call :timestamp2date %TOTALSEC% echo %DAY%.%MONTH%.%YEAR% %HOUR%:%MIN%:%SEC% exit rem перевести секунды в дату rem %1 - timestap время в секундах с 01.01.%YEARBEGIN% rem Возврат в переменных YEAR, MONTH, DAY, HOUR, MIN, SEC :timestamp2date set "TT=%1" set /a "SEC=TT%%60" set /a "TT=(TT-SEC)/60" set /a "MIN=TT%%60" set /a "TT=(TT-MIN)/60" set /a "HOUR=TT%%24" set /a "TT=(TT-HOUR)/24" set /a "YEAR=TT/365" set /a "TT-=YEAR*365" set /a "YEAR=YEAR+YEARBEGIN" for /l %%i in (%YEARBEGIN%,1,%YEAR%) do ( call:isleap %%i set /a "TT-=LEAP" ) set /a "TT+=LEAP" set "MONTH=1" if %LEAP% equ 1 (set "mdays=%visok%") else (set "mdays=%regul%") for %%i in (%mdays%) do ( if %%i gtr !TT! goto:step3 set /a "TT-=%%i" set /a "MONTH+=1" ) :step3 set /a "DAY=TT+1" set "TT=" exit /b rem перевести дату в секунды rem %1 - год (4 знака), %2 - месяц (1-12) %3 - день (1-31) %4 - часы (0-23) %5 - минуты (0-59) %6 - секунды (0-59) :date2timestamp rem yearsecs=31536000 HOURSSEC=3600 daysecs=86400 set /a "TOTALSEC=(%1-YEARBEGIN)*31536000" for /l %%i in (%YEARBEGIN%;1;%1) do ( call:isleap %%i if !LEAP! equ 1 set /a "TOTALSEC+=86400" ) call:isleap %1 if %LEAP% equ 1 (call:month2sec "%visok%" %2) else (call:month2sec "%regul%" %2) set /a "TOTALSEC+=(%3-1)*86400" set /a "TOTALSEC+=%4*3600" set /a "TOTALSEC+=%5*60+%6" exit /b rem определяет високосность года rem Если год точно делится на 4, но не делится на 100 или если он точно делится на 400 rem function isleap(year) rem возврат в переменной LEAP=1 - год высокосный, иначе - 0 :isleap set "LEAP=0" set /a "L1=%1%%4" set /a "L2=%1%%100" set /a "L3=%1%%400" if %L1% equ 0 if %L2% neq 0 set "LEAP=1" if %L3% equ 0 set "LEAP=1" set L1= set L2= set L3= exit /b rem %1 - массив regul или visok, %2 - текущий месяц :month2sec set /a "COUNT=1" for %%i in (%~1) do ( if !COUNT! LSS %2 set /a "TOTALSEC+=%%i*86400" set /a "COUNT+=1" ) set COUNT= exit /b |
| Всего записей: 2580 | Зарегистр. 11-04-2003 | Отправлено: 20:37 12-10-2010 | Исправлено: res2001, 20:37 12-10-2010 |
|