2014-12-19 24 views
0

我用這樣的代碼在Windows擊獲取當前時間:回聲設置特定時間

set hour=%TIME:~0,2% 
set minute=%TIME:~3,2% 
set second=%TIME:~6,2% 

但我需要一個當前時間13秒。有什麼方法可以得到這個嗎?

+0

創建EXE文件,並得到輸出。 – i486 2014-12-19 09:21:52

回答

2

Assumming一個24小時時間HH:MM:SS,CC格式,

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    for /f "tokens=1-3 delims=:., " %%a in ("%time%") do (
     set /a "second=100%%c %% 100 +13",^
       "minute=100%%b %% 100 +second/60",^
       "hour=(100%%a %% 100 +minute/60) %% 24 +100",^
       "minute=minute %% 60 +100",^
       "second=second %% 60 +100" 
    ) 
    echo %time% 
    echo %hour:~-2%:%minute:~-2%:%second:~-2% 

的時間字符串被標記化(是的,子串操作都同樣有效,但我認爲這是一個更簡單的方法),因此小時在%%a檢索,並且在%%b分鐘秒%%c和Calcs(計算)完成

對於這三個小時的元素,從%time%字符串所檢索的值的前綴爲100,然後mod 100操作,則一個將避免0809值被認爲是錯誤的八進制值的問題。一旦正確的十進制值被檢索,我們可以操作

second = currentSeconds + 13 
minute = currentMinutes + 1 (if second > 60) 
hour = currentHour + 1 (if minute > 60) adjusted to 24h + 100 (for padding) 
minute = minute adjusted to 0-59 range + 100 (for padding) 
second = second adjusted to 0-59 range + 100 (for padding) 

我們在第二端,值的範圍在100-159,100-159在分,100-123在小時。這樣我們可以正確輸出填充時間元素,從每個變量中檢索最後兩位數字。

+2

如果13秒跨越從標準時間到夏令時的轉換(反之亦然),該怎麼辦? - 邪惡的笑容:-) – dbenham 2014-12-19 14:36:33

+0

@dbenham,;)它可以[更糟](http://stackoverflow.com/a/6841479/2861476)。但無論如何,時間加上13秒的操作不受夏令時,星際秒數或UTC協調的影響。這是一個純粹的時間操作,沒有日期,所以沒有任何指出的考慮因素適用。 **但是**當然這是*「可能」*在使用此計算的代碼的其餘部分需要考慮的事項。謝謝。 – 2014-12-19 14:52:33

0

我需要當前時間+13秒。添加13秒似乎是最簡單的任務,但也有一些複雜性:

  • 所有數值在set /A即開始以零作爲 八進制,但08和09治療是無效的八進制數字。參看接下來的解決辦法與 %%操作:set /A "val=100%lav%%%100"
  • 超過59秒數值會影響分鐘,超過59分鐘 值的影響小時,超過23小時值似乎是不可能 以及...

腳本:

@ECHO OFF >NUL 
@SETLOCAL 
set "myTIME=%TIME%" 
call :plus13 "%myTIME%" 6 13 60 second carry 
call :plus13 "%myTIME%" 3 %carry% 60 minute carry 
call :plus13 "%myTIME%" 0 %carry% 24 hour carry 
echo "%myTIME%" 
echo "%hour% %minute% %second%" 
@ENDLOCAL 
@goto :eof 

:: plus13 procedure 
:: %1 = time value 
:: %2 = position in time 
:: %3 = value to add 
:: %4 = threshold 
:: %5 = name of time variable 
:: %6 = name of carry variable 
:plus13 
@SETLOCAL enableextensions enabledelayedexpansion 
set "lav=%~1" 
set "lav=!lav:~%2,2!" 
set /A "val=100%lav%%%100" 
set /A "val+=%3" 
if %val% GEQ %4 (
    set /A "val-=%4" 
    set /A "car=1" 
) else (set /a "car=0") 
if %val% LSS 10 set "val=0%val%" 
@ENDLOCAL&set %5=%val%&set %6=%car%&goto :eof 

輸出:

C:\...>time13s 
"11:51:49,50" 
"11 52 02" 
1

類似於其他解決方案,但我首先計算一天中的秒數,然後加上13.
然後將結果數字格式化回hh:mm:ss格式。

rem ** Calculate the seconds of the day 
for /f "tokens=1-3 delims=:., " %%a in ("%time: =0%") do (
    set /a "secOfDay=1%%c %% 100 + 60*(1%%b %% 100) + 3600*(1%%a %% 100)" 
) 

REM ** Add the desired offset 
set /a timePlus13sec=secOfDay+13 

REM ** Convert the new time to the HH:mm:ss format 
set /a sec=100+timePlus13sec %% 60 
set /a temp=timePlus13sec/60 
set /a min=100+temp %% 60 
set /a hour=100+(temp/60) %% 24 

echo %hour:~-2%:%min:~-2%:%sec:~-2% 
1

這種方法使用JScript輔助代碼,因此它始終是正確的:

@echo off 

echo d=new Date();d.setTime(d.getTime()+13000);WScript.Echo(d.toString().split(' ')[3]);> test.js 

for /F %%a in ('cscript //nologo test.js') do set timeAhead=%%a 
echo Time plus 13 seconds: %timeAhead%