Board logo

标题: 批处理 将秒转换成日时分秒 [打印本页]

作者: PPdos     时间: 2007-1-16 22:15    标题: 批处理 将秒转换成日时分秒

一道C语言题 请用批处理做 例如:

输入(秒):3662

显示: 0天 1 小时 1分钟 2秒
作者: namejm     时间: 2007-1-16 23:28
  以下演示代码没有做错误检测,请测试:
@echo off

:begin
cls
set /a D=0,H=0,M=0
set num=
set /p num=     请输入秒数(退出请直接按回车):
if not defined num exit

call :transform D %num% 86400
call :transform H %num% 3600
call :transform M %num% 60

echo       %D% 天 %H% 小时 %M% 分 %num% 秒

pause
goto begin

:transform
set /a %1=%2/%3
if %1 gtr 0 set /a num=%2-%3*%1
goto :eof
  精简一下代码。

[ Last edited by namejm on 2007-1-16 at 12:17 PM ]
作者: zh159     时间: 2007-1-16 23:40

@echo off
:begin
cls
echo.
set input=
set /p input=  请输入秒数(退出请直接按回车):
if not defined input exit
set /a SS=%input%%%60
set /a MM=%input%/60%%60
set /a HH=%input%/3600%%60
set /a DD=%input%/86400%%60
echo.
echo   %DD% 天 %HH% 小时 %MM% 分 %SS% 秒
echo.
pause
goto begin

作者: namejm     时间: 2007-1-16 23:48
  呵呵,zh159 兄的思路更直接啊,我复杂化了。
作者: redtek     时间: 2007-1-16 23:50
精彩!!!顶~~
作者: scriptor     时间: 2007-1-17 00:02
一个简单的数学问题啊
呵呵

程序就也要简单
作者: scriptor     时间: 2007-1-17 00:08
如果输入的是
xxxxx.34

还要考虑毫秒

那么2楼和3楼的代码就是不能执行的

[ Last edited by scriptor on 2007-1-16 at 11:09 AM ]
作者: namejm     时间: 2007-1-17 00:56
  3楼的代码计算天数的时候,再除以60来取余数会出问题的,应该去掉 %%60 。
作者: zh159     时间: 2007-1-17 02:28
当时随手写了,修正:
@echo off
:begin
cls
echo.
set input=
set /p input=  请输入秒数(退出请直接按回车):
if not defined input exit
set /a SS=%input%%%60
set /a MM=%input%/60%%60
set /a HH=%input%/3600%%60
if %HH% GEQ 24 set /a HH=HH%%24
set /a DD=%input%/86400
echo.
echo   %DD% 天 %HH% 小时 %MM% 分 %SS% 秒
echo.
pause
goto begin
带毫秒的:
PS:毫秒是1000进1秒
@echo off
:begin
cls
echo.
set input=
set /p input=  请输入秒数(退出请直接按回车):
if not defined input exit
for /f "tokens=1* delims=." %%i in ("%input%") do set input=%%i&&set .n=%%j
if "%.n%" == "" set .n=0
if "%.n:~1%" == "" set .n=%.n%0
if "%.n:~2%" == "" set .n=%.n%0
if "%.n:~0,1%" == "0" set .n=%.n:~1%
if "%.n:~0,1%" == "0" set .n=%.n:~1%


set /a SS=%input%%%60
set /a MM=%input%/60%%60
set /a HH=%input%/3600%%60
if %HH% GEQ 24 set /a HH=HH%%24
set /a DD=%input%/86400
echo.
echo   %DD% 天 %HH% 小时 %MM% 分 %SS% 秒 %.n% 毫秒
echo.
pause
goto begin
[ Last edited by zh159 on 2007-1-16 at 09:42 PM ]
作者: hxuan999     时间: 2007-1-17 02:37
处理毫秒的时候有问题呀.比如输入5485.3,那.3应该是300毫秒吧,而不是3毫秒呀.
作者: zh159     时间: 2007-1-17 02:46


  Quote:
Originally posted by hxuan999 at 2007-1-16 13:37:
处理毫秒的时候有问题呀.比如输入5485.3,那.3应该是300毫秒吧,而不是3毫秒呀.

忘了-_-|||
谢谢提醒,已修正,不过还不能处理4位小数以上的

[ Last edited by zh159 on 2007-1-16 at 01:48 PM ]
作者: hxuan999     时间: 2007-1-17 02:54
我也来一个,带毫秒的(超过四位小数的被截取到000.00毫秒):

  Quote:

  1. @echo off&setlocal enabledelayedexpansion
  2. :begin
  3. cls
  4. echo;
  5. set input=
  6. set /p input= 请输入秒数(退出请直接按回车 )
  7. if not defined input exit
  8. for /f "tokens=1* delims=." %%a in ("%input%") do set input=%%a & set D5=%%b00000
  9. for /l %%i in (4,-1,2) do set /a "D%%i=!input!%%60" && set /a "input=!input!/60"
  10. set "D5=!D5:~0,3!.!D5:~3,2!"
  11. set /a "D1=!input!%%24"
  12. echo;&echo;  %D1%%D2% 小时 %D3%%D4%%D5% 毫秒&echo;
  13. pause
  14. goto begin
        hxuan:  2007-01-17  12:52

此程序已经修正.

[ Last edited by hxuan999 on 2007-1-17 at 01:59 PM ]
作者: namejm     时间: 2007-1-17 04:15
  12楼的代码有如下缺陷:

  1、截取小数部分用替换语句是容易出错的,比如:整数部分是小数部分的某一个字符串的时候,如 23.1234。建议不要使用如此另类的语句,还是用 for 语句中的 delims=. 来提取吧;

  2、计算天数的时候,仍然除了60,这是不正确的。
作者: tao0610     时间: 2007-1-17 07:22

@echo off
:start
setlocal
cls&echo.
set/p input=请输入秒数:
for /f "tokens=1,2 delims=." %%a in ("%input%") do set input=%%a&set input1=%%b
for /l %%a in (1,1,2) do set/a T%%a=input%%60,input/=60
set/a T3=input%%24,T4=input/24
set input1=%input1%0000
for /f "tokens=* delims=0" %%a in ("%input1:~0,4%") do set T0=%%a
echo/
if defined T0 (echo %T4% 天 %T3% 小时 %T2% 分 %T1% 秒 %T0% 毫秒
) else (echo %T4% 天 %T3% 小时 %T2% 分 %T1% 秒)
echo\
pause
endlocal
goto start
..
作者: PPdos     时间: 2007-1-17 09:39
各位厉害。。竟然连毫秒都准确到了 。。看来可以修改成春节倒计时了^^
作者: zouzhxi     时间: 2007-1-17 09:52
如果我输入字母,它还是会出现:

  Quote:
请输入秒数:dddd

0 天 0 小时 0 分 0 秒

请按任意键继续. . .

我是不是来捣乱,,,的...嘻嘻...;)

[ Last edited by zouzhxi on 2007-1-17 at 09:54 AM ]
作者: PPdos     时间: 2007-1-17 11:02
将以上代码理解为(非毫秒):

set /a D=%t%/86400
set /a H=%t%%%86400/3600
set /a M=%t%%%86400%%3600/60
set /a S=%t%%%86400%%3600%%60
ECHO %D%日%H%时%M%分%S%秒

感悟即:取值为t 除86400秒(等于1日)商为天数 余数除3600秒(等于1小时)商为小时数 余数再循环 以次类推可推广至周月年 但因为32位精确限制将达不到最大预期效果
作者: hxuan999     时间: 2007-1-18 01:55


  Quote:
Originally posted by namejm at 2007-1-16 16:15:
  12楼的代码有如下缺陷:

  1、截取小数部分用替换语句是容易出错的,比如:整数部分是小数部分的某一个字符串的时候,如 23.1234。建议不 ...

谢谢指出,呵呵.写的草率了.已经修正了.
作者: everest79     时间: 2007-1-18 07:15


  Quote:
Originally posted by PPdos at 2007-1-16 08:39 PM:
各位厉害。。竟然连毫秒都准确到了 。。看来可以修改成春节倒计时了^^


@ECHO OFF&MODE CON COLS=40 LINES=3&TITLE=新年倒计时
SETLOCAL ENABLEDELAYEDEXPANSION
SET /A YEAR=%DATE:~0,4%,MONTH=%DATE:~5,2%,DAY=%DATE:~8,2%
CALL :ALG MONTH %MONTH%&&CALL :ALG DAY %DAY%
IF NOT "%1" == "" SET NB=%1&&GOTO :TOPY
SET /A NX=%RANDOM%%%12+1,NZ=%RANDOM%%%28+1
SET NYY=%NX%.%NZ%
:TOPX
CLS&ECHO.&SET /P NB=%NYY%过年?
IF "%NB%" == "" SET NB=%NYY%&&GOTO TOPZ
IF /I "%NB:~0,1%" == "n" SET NYY=那是什么时候&&GOTO TOPX
IF /I "%NB:~0,1%" == "y" SET NB=%NYY%&&GOTO TOPY
IF NOT "%NB%" == "" SET NYY=%NB%&&GOTO TOPX
:TOPY
ECHO %NB%|FINDSTR /R "^[0-9]*[.:;/][0-9]*">nul||GOTO TOPX
FOR /F "tokens=1,2 delims=.:;-/" %%i IN ("%NB%") DO CALL :ALG BM %%i&CALL :ALG BD %%j
IF NOT %BM% GTR 0 (GOTO TOP) ELSE IF %BM% GTR 12 GOTO TOPX
IF NOT %BD% GTR 0 (GOTO TOP) ELSE IF %BD% GTR 31 GOTO TOPX
FOR /L %%i IN (1,1,12) DO (
       if %%i geq 8 (set d1=30&&set d2=31) else set d1=31&&set d2=30
       set /a st=%%i%%2
       if !st! equ 0 (set M%%i=!d2!) else set M%%i=!d1!)
CALL :LM %YEAR%
IF %BM% GTR %MONTH% SET GO=GTR
IF %BM% EQU %MONTH% SET GO=EQU
IF %BM% LSS %MONTH% SET /A NEWYEAR=%YEAR%+1&&SET GO=LSS
GOTO %GO%

:GTR
FOR /L %%i IN (%MONTH%,1,%BM%) DO SET /A DALL=!DALL!+M%%i
SET /A DALL=%DALL%+!M%MONTH%!-%DAY%+%BD%-M%MONTH%-M%BM%
GOTO TIME

:EQU
IF %BD% GTR %DAY% SET /A DALL=%BD%-%DAY%&&GOTO TIME
IF %BD% EQU %DAY% SET DALL=0&&GOTO TIME
IF %BD% LSS %DAY% SET /A NERA=%DAY%-%BD%&&GOTO LSS

:LSS
FOR /L %%i IN (%MONTH%,1,12) DO SET /A OALL+=M%%i
SET /A OALL=%OALL%+!M%MONTH%!-%DAY%-M%MONTH%
CALL :LM %NEWYEAR%
FOR /L %%i IN (1,1,%BM%) DO SET /A NALL+=M%%i
SET /A NALL+=%BD%-M%BM%
SET /A DALL=%OALL%+%NALL%

:TIME
FOR /F "tokens=1-4 delims=:." %%a IN ("%TIME%") DO (
CALL :ALG TT %%b&&CALL :ALG TS %%c&&CALL :ALG TM %%d
SET /A TH=24-%%a-1,TT=60-!TT!-1,TS=60-!TS!-1,TM=1000-!TM!*10
CLS&ECHO/&ECHO 距新年还有%DALL%天!TH!小时!TT!分!TS!秒!TM!毫秒)
IF "%DAY%" == "%DATE:~8,2%" (GOTO TIME) ELSE GOTO END

:END
START /I "" %0 "NB"
GOTO :EOF

:LM
SET /A LM=(%1-2000)%%4
IF NOT %LM% EQU 0 (SET M2=28) ELSE SET M2=29
GOTO :EOF

:ALG
SET CHKALG=%2
IF "%CHKALG:~1,1%" == "" SET %1=%CHKALG%&GOTO :EOF
SET /A %1=%CHKALG:~0,1%*10+%CHKALG:~-1%
GOTO :EOF
我刚写的嘿嘿:D
作者: uiopuiop     时间: 2007-10-5 10:21
有办法突破11天的限制吗?如果数字太大会溢出啊,多谢!


  请输入秒数(退出请直接按回车):4321432531252
Invalid number.  Numbers are limited to 32-bits of precision.
Invalid number.  Numbers are limited to 32-bits of precision.
Invalid number.  Numbers are limited to 32-bits of precision.
Invalid number.  Numbers are limited to 32-bits of precision.

  11 天 32 小时 19 分 47 秒
作者: uiopuiop     时间: 2007-10-5 10:27    标题: 这个方法好点

这个论坛果然不错!!! 强烈支持!


@echo off
:begin
cls
echo.
set input=
set /p input=  请输入秒数(退出请直接按回车):
if not defined input exit
set /a SS=%input%%%60
set /a MM=%input%/60%%60
set /a HH=%input%/3600%%60
if %HH% GEQ 24 set /a HH=HH%%24
set /a DD=%input%/86400
if %DD% GEQ 7 set /a DD=DD%%7
set /a WW=%input%/604800%%60
echo.
if %DD% GEQ 1 (echo %WW% 周 %DD% 天 %HH% 小时 %MM% 分 %SS% 秒
) else (
echo %DD% 天 %HH% 小时 %MM% 分 %SS% 秒
)
echo.
pause
goto begin

[ Last edited by uiopuiop on 2007-10-5 at 11:28 AM ]
作者: uiopuiop     时间: 2007-10-5 10:33
不过。。。。。

  请输入秒数(退出请直接按回车):65356534654
Invalid number.  Numbers are limited to 32-bits of precision.
Invalid number.  Numbers are limited to 32-bits of precision.
Invalid number.  Numbers are limited to 32-bits of precision.
Invalid number.  Numbers are limited to 32-bits of precision.
Invalid number.  Numbers are limited to 32-bits of precision.

  29 周 25 天 10 小时 33 分 20 秒
作者: uiopuiop     时间: 2007-10-5 11:53    标题: 算法有误

请输入秒数(退出请直接按回车):3431253

5 周 4 天 5 小时 7 分 33 秒

好像因该时17小时,不是5小时。。。。

[ Last edited by uiopuiop on 2007-10-5 at 12:04 PM ]
作者: scriptor     时间: 2007-10-5 12:25
http://www.cn-dos.net/forum/view ... =%E6%97%B6%E9%97%B4

看这个!! :)
作者: uiopuiop     时间: 2007-10-5 12:29
你的算法很好,小弟愚笨,如何输入以秒为单位的数字,输出只要精确到秒就可以了。并且代码在一个批处理里。


能不能写出来,万分感激!

[ Last edited by uiopuiop on 2007-10-5 at 12:54 PM ]