标题: [已放弃请勿进]关于对任意时间的回溯
[打印本页]
作者: bat-zw
时间: 2008-6-1 21:58
标题: [已放弃请勿进]关于对任意时间的回溯
&&因一个兄弟的求助贴,突然想到写一个任意时间回溯的批处理(非vbs),因为
知道要对分时日月年进行判断相当复杂,开始也做好了思想准备,可写到中间才
真正明白此中的难处,难就难在怎么把别人输入的任意时间进行转换计算,如输
入0 0 0 0 100000(指100000分钟),怎么把之转代成要回溯的年月日时分,我
脑壳想破了也没想清楚,望大家帮理一下思路,因问题的意思也难以描述清楚,
特在下面贴出我的部分代码:
@echo off&color 1f&mode con lines=10&setlocal enabledelayedexpansion
title ***时间回溯批处理*** by cn-dos zw19750516
:begin
cls&echo.&echo ===============================================================================
echo 请输入要回溯的时间,请按年 月 日 时 分的格式正确输入,无数值的请输入0,中间请用空格格开,请不要在数值前补0,如:10 6 1 19 44(10年6个月1天19个小时44分钟),0 0 0 0 400(400分钟),而10 06 01 19 44和10 6以及10 6 0 0 0 0均为错误输入。
echo ===============================================================================
echo.&set /p times=请在此输入:
echo %times: =%|findstr "[^0-9]"&&goto wrong
for %%i in (%times%) do (
set /a n+=1&set str=%%i
if "!str:~,1!" equ "0" goto wrong
)
if !n! neq 5 goto wrong
set n=0
for /f "tokens=1-5 delims= " %%a in ("%times%") do set /a ys=%%a,ms=%%b,ds=%%c,hs=%%d,mis=%%e
set /a y=%date:~,4%,m=100%date:~5,2%%%100,d=100%date:~8,2%%%100,mi=100%time:~3,2%%%100
if "%time:~,1%"=="" (set h=%time:~1,1%) else (set h=%time:~,2%)
set /a a=%y%%%4,b=%y%%%100,c=%y%%%400
if %c% equ 0 (set yun=A) else (if %a% equ 0 if %b% neq 0 set yun=A)
if defined yun (set n=29) else (set n=28)
set /a mi-=mis,h-=hs,d-=ds,m-=ms,h-=hs
............................
:wrong
cls&echo.&echo.&echo 错误的数值,请正确输入&ping /n 2 127.1>nul&goto begin
[
Last edited by zw19750516 on 2008-6-2 at 12:39 AM ]
作者: bat-zw
时间: 2008-6-1 22:17
顶,来人啊!!!
作者: plp626
时间: 2008-6-1 22:20
我对次类问题的算法就是:先把任意给定的日期转换为分钟数(根据需要还可转为秒数,小时,天数),再将分钟数转换为日前,
可以参看函数库里的函数---timediff
作者: 26933062
时间: 2008-6-1 22:23
其实对天数的回溯,论坛早有经典代码了。
只要对时间部分判断一下天数就可以了。
作者: bat-zw
时间: 2008-6-1 22:28
兄弟们是不是想简单了啊,论坛相关的贴子我都看了的,还在qq上和namejm讨论了。
作者: bat-zw
时间: 2008-6-1 22:32
其实的我的本意是写一个任意时间回溯批处理出来,别人只要按年 月 日 时 分的输入格式输入的任一组五个数值就能得到回溯后是?年?月?日?时?分,如输入0 0 0 100000 0(100000小时)。
作者: HAT
时间: 2008-6-1 22:35
要求 zw19750516 兄公布自己的QQ号码和 namejm 的QQ号码^_^
作者: 26933062
时间: 2008-6-1 22:37
提供个思路
先把 月 、日、时间、转换成天数。
再用当前年减去输入的年、
再用结果减去转换的天数、最后在精确一下时间。
作者: bat-zw
时间: 2008-6-1 22:52
Quote: |
Originally posted by 26933062 at 2008-6-1 22:37:
提供个思路
先把 月 、日、时间、转换成天数。
再用当前年减去输入的年、
再用结果减去转换的天数、最后在精确一下时间。 |
|
谢谢兄弟多次关注,请看这组数值20 34 600 4000 10000,回溯20年34个月600天4000个小时10000分钟,我有个思路就是把系统当前时间到公元元年元月元日零时零分的时间差以分为计数单位算出来,然后将输入的所有时间转为以分计数的值,再将系统值减去输入转换值,再从基准值公元元年元月元日零时零分正推年月日时分,问题是在转换输入值为分时是相当难的。如20年=?分,34月=?分
作者: slore
时间: 2008-6-1 22:55
路过……
还是VBS爽嗬~~
作者: bat-zw
时间: 2008-6-1 23:00
真的感觉好难啊,难道真用批处理就解决不了这个问题吗?
作者: terse
时间: 2008-6-1 23:05
会不会溢出
还有我运行上面的怎么老是错误
这个P的作用是什么
作者: 26933062
时间: 2008-6-1 23:11
若是全部转换为分的话将是一个超大数,那又牵扯到大数的计算问题。
另外还有个疑问:20年2个月600天4000个小时10000分钟
如上, 2 个月是指的什么? 比如今天是6月1日,2个月前是 4月1日吗?
还是当前时间减去 600天4000个小时10000分钟 以后的 2 个月?
作者: bat-zw
时间: 2008-6-1 23:18
Quote: |
Originally posted by 26933062 at 2008-6-1 23:11:
若是全部转换为分的话将是一个超大数,那又牵扯到大数的计算问题。
另外还有个疑问:20年2个月600天4000个小时10000分钟
如上, 2 个月是指的什么 ... |
|
20 34 600 4000 10000这个五个数值全是要经过推算的,不是简单的同位相减
作者: moniuming
时间: 2008-6-1 23:19
Quote: |
若是全部转换为分的话将是一个超大数,那又牵扯到大数的计算问题。
另外还有个疑问:20年2个月600天4000个小时10000分钟
如上, 2 个月是指的什么? 比如今天是6月1日,2个月前是 4月1日吗?
还是当前时间减去 600天4000个小时10000分钟 以后的 2 个月? |
|
我觉得楼主的意思是:20年+2个月+600天+4000个小时+10000分钟
但感觉没什么意义,甚至.............唉
作者: bat-zw
时间: 2008-6-1 23:22
Quote: |
Originally posted by moniuming at 2008-6-1 23:19:
我觉得楼主的意思是:20年+2个月+600天+4000个小时+10000分钟
但感觉没什么意义,甚至.............唉 |
|
这不是没意义,我写这个批处理动机就是为了让大家能方便的回溯时间。
作者: 26933062
时间: 2008-6-1 23:23
20年2个月600天4000个小时10000分钟
这么说吧
当前时间先减去10000分钟、再减去4000个小时、再减去600天,
假设此时结果为 2005年3月20日19点20分 那么此时再减去2个月,该如何减?
结果是 2005年1月20日19点20分 吗?
作者: terse
时间: 2008-6-1 23:26
如果仅仅这样估计还好处理
下面是算天数的 加上处理小时和分应该没问题吧
@echo off
SET/p TT=你想知道多少天前的日期?
for /f "tokens=1-3 delims=-/\:. " %%i in ("%date%") do set /a p1=%%i,p2=100%%j%%100,p3=100%%k%%100
if %p3% gtr %TT% goto ppp
:nxt
set/a p2-=1
if %p2% equ 0 set/a p1-=1&&set p2=12
set/a PN2="!(p1%%4) & !(!(p1%%100)) | !(p1%%400)",PN2=28+PN2
for /f "tokens=%p2%" %%i in ("31 %pN2% 31 30 31 30 31 31 30 31 30 31") do set/a p3=%p3%+%%i
if %p3% leq %tt% goto nxt
:ppp
set/a p3=%p3%-%tt%
setlocal enabledelayedexpansion
for %%i in (p2 p3) do if !%%i! lss 10 set %%i=0!%%i!
echo %p1%年%p2%月%p3%日
pause&goto :eof
作者: bat-zw
时间: 2008-6-1 23:28
Quote: |
Originally posted by 26933062 at 2008-6-1 23:23:
20年2个月600天4000个小时10000分钟
这么说吧
当前时间先减去10000分钟、再减去4000个小时、再减去600天,
假设此时结果为 2005年3月20日19点20分 那么此 ... |
|
兄弟思路出偏差了,最后根本不会存在整减两个月,而应是将前面的先转换运算,然后从分一路递减到年
[
Last edited by zw19750516 on 2008-6-1 at 11:30 PM ]
作者: bat-zw
时间: 2008-6-1 23:36
Quote: |
Originally posted by terse at 2008-6-1 23:26:
如果仅仅这样估计还好处理
下面是算天数的 加上处理小时和分应该没问题吧
[code]
@echo off
SET/p TT=你想知道多少天前的日期?
for /f "tokens=1-3 delim ... |
|
老兄应该还记得我以前发的几个关于日期计算的贴子吧,请相信我对这样的算法还是没问题的,我现在要解决的是换算任意时间的问题。
作者: terse
时间: 2008-6-1 23:45
Quote: |
Originally posted by zw19750516 at 2008-6-1 23:36:
老兄应该还记得我以前发的几个关于日期计算的贴子吧,请相信我对这样的算法还是没问题的,我现在要解决的是换算任意时间的问题。 |
|
怎么个换算任意时间 恕小弟愚笨 望兄来解说一下
作者: bat-zw
时间: 2008-6-1 23:53
Quote: |
Originally posted by terse at 2008-6-1 23:45:
怎么个换算任意时间 恕小弟愚笨 望兄来解说一下 |
|
晕,前面都讨论了这么久了,兄弟还没明白我的意思啊,也只怪我没说明白。
如在时间回溯批处理提示输入处输入:20 38 67 900 30000,从当前时间向前
回溯20年+38个月+67天+900个小时+30000分钟是?年?月?日?时?分。
首选要将分换算成整时a+余数,再将时+a后换算成整月b+余数(在这果就卡壳
了),再将月+b后换算成整年c+余数,再将年+c,然后更想不清楚了。。。
[
Last edited by zw19750516 on 2008-6-1 at 11:59 PM ]
作者: 26933062
时间: 2008-6-1 23:55
确实理解不了题意了。
20年或2个月,始终都必须有个具体天数才对啊?那么就必然存在我17楼说的现象。
作者: bat-zw
时间: 2008-6-2 00:03
Quote: |
Originally posted by 26933062 at 2008-6-1 23:55:
确实理解不了题意了。
20年或2个月,始终都必须有个具体天数才对啊?那么就必然存在我17楼说的现象。 |
|
天数是肯定有的,在时间坐标上从当前时间向前回溯20年+39个月+470天+6000
个小时+10001分钟这个时间点肯定是存在的,问题是我们怎么去找到这个时间
点,这里面就将涉及到一系列的判断和转换运算了。
ps:兄弟不会也觉得我是个外星人吧,呵呵。
[
Last edited by zw19750516 on 2008-6-2 at 12:05 AM ]
作者: terse
时间: 2008-6-2 00:17
这样看来 次序应该也有说法 因为有闰 是不是呢?
作者: bat-zw
时间: 2008-6-2 00:21
Quote: |
Originally posted by terse at 2008-6-2 00:17:
这样看来 次序应该也有说法 因为有闰 是不是呢? |
|
说了次序是分-时-天-月-年,就是因为闰的问题还有每月天数不同的问题才会这么
难!!!
作者: 26933062
时间: 2008-6-2 00:24
假设当前时间是 2008年4月2日20点10分
问: 2个月前1天1小时1分钟 是什么时间,你用手工计算告诉我答案吧、
然后说说你的计算过程。
作者: bat-zw
时间: 2008-6-2 00:30
9分19点1日2月2008年,这个好算,下面这个就不好算了:
2008年4月20日20点10分的前2个月48天29个小时78分钟
[
Last edited by zw19750516 on 2008-6-2 at 12:31 AM ]
作者: bat-zw
时间: 2008-6-2 00:37
算了,可能真的是我太想复杂了(事实上根本不存在如20年前39个月500天6000个小时10000分钟之说),明天还要上班,先睡觉了,谢谢兄弟们了。
作者: 26933062
时间: 2008-6-2 00:43
Quote: |
Originally posted by zw19750516 at 2008-6-2 00:30:
9分19点1日2月2008年,这个好算,下面这个就不好算了:
[ Last edited by zw19750516 on 2008-6-2 at 12:31 AM ] |
|
你这个难道不是减去整2个月吗?
先减去分,时、天、结果为:2008年4月1日19点9分
再减去2整月、即:4减2 得到 2008年2月1日19点9分
作者: bat-zw
时间: 2008-6-2 00:46
Quote: |
Originally posted by 26933062 at 2008-6-2 00:43:
你这个难道不是减去整2个月吗?
先减去分,时、天、结果为:2008年4月1日19点9分
再减去2整月、即:4减2 得到 2008年2月1日19点9分 |
|
请看我的计算顺序,如将天改为10天前就不是整减两个月了吧。
作者: terse
时间: 2008-6-2 02:59
头大了 没详细测试
@echo off
set/p times=输入年月日小时分
for /f "tokens=1-5 delims= " %%a in ("%times%") do set /a yy=%%a,mm=%%b,tt=%%c,hh=%%d,ss=%%e
for /f "tokens=1-3 delims=-/\:. " %%i in ("%date%") do set /a p1=%%i,p2=100%%j%%100,p3=100%%k%%100
for /f "tokens=1-3 delims=:" %%i in ('time/t') do set /a t1=100%%i%%100,t2=100%%j%%100
set/a s2=ss%%60,t1-=ss/60%%24,t2-=s2,hh+=ss/60
if %t2% lss 0 set/a t2+=60
if %t1% lss 0 set/a t1+=24
set/a h1=hh%%24,tt+=(hh-h1)/24,t1-=h1
if %t1% lss 0 set/a t1+=24,tt+=1
set/a p1-=yy
set/a m2=mm%%12,p1-=(mm+p2)/12,p2-=m2
if %p2% leq 0 set/a p2+=12
if %p3% gtr %TT% goto ppp
:nxt
set/a p2-=1
if %p2% equ 0 set/a p1-=1&&set p2=12
set/a PN2="!(p1%%4) & !(!(p1%%100)) | !(p1%%400)",PN2=28+PN2
for /f "tokens=%p2%" %%i in ("31 %pN2% 31 30 31 30 31 31 30 31 30 31") do set/a p3=%p3%+%%i
if %p3% leq %tt% goto nxt
:ppp
set/a p3=%p3%-%tt%
setlocal enabledelayedexpansion
for %%i in (p2 p3 t1 t2) do if !%%i! lss 10 set %%i=0!%%i!
echo %p1%年%p2%月%p3%日%t1%时%t2%分
pause&goto :eof
作者: hhasee
时间: 2008-10-13 08:43
有胆略尝式就是好样的!!