标题: [日期时间] 批处理计算日期和C计算日期 [打印本页]
作者: Gin_Q 时间: 2019-12-10 19:33 标题: 批处理计算日期和C计算日期
本帖最后由 Gin_Q 于 2020-3-9 19:09 编辑
- @echo off& color f9& title by author Gan& setlocal enabledelayedexpansion&pushd "%cd%"& rem 20:10 2019/11/23
- ::ond=求前xx天的日期
- set w1=日一二三四五六
- for /l %%a in (1,1,300) do call :tt %%a
- ::call :tt 9
- pause&exit
- :tt
- ::set date1=%date%& rem 当前日期
- set date1=%date%
- set /a m1=31, m2=28, m3=31, m4=30, m5=31, m6=30, m7=31, m8=31, m9=30, m10=31, m11=30, m12=31& rem 平年每月天数
- set /a ond=%1
- set /a ond1=%ond%
- set date2=%date1%
- set year=%date1:~0,4%
-
- :yyr
- for /f "tokens=1-3 delims=\/: " %%a in ("%date2%") do (set /a year=%%a, oldm=1%%b%%100, day=1%%c%%100)
-
- call :twomonth
- :lri
- set /a ri=m!oldm!-day
- if !ond! leq !ri! (set /a day+=ond& goto:zhou)
- set /a ond1-=ri, oldm+=1
- :loop
- set /a n=1
- for /l %%a in (1,1,!n!) do ( set /a day=0
- if !oldm! gtr 12 set /a oldm=1, year+=1& call :twomonth
- ::rem 每月天数
- set /a oldmd=m!oldm!
- if !ond1! leq !oldmd! (set /a day+=ond1) else (set /a ond1-=oldmd, oldm+=1& goto :loop))
-
- :zhou
- ::rem 计算星期
- if %oldm% lss 10 set oldm=0%oldm%
- if %day% lss 10 set day=0%day%
- set date3=!year!/%oldm%/%day%
- for /f "tokens=1-3 delims=\/: " %%a in ("%date3%") do (set /a year=%%a, month=1%%b%%100, day=1%%c%%100)
- set y2=%year:~2,2%
- set /a sj= year/100
- if %month% equ 1 set /a month=13, year-=1, sj=!year!/100& set y2=!year:~2,2!
- if %month% equ 2 set /a month=14, year-=1, sj=!year!/100& set y2=!year:~2,2!
- set /a w=(y2+y2/4+sj/4+(-2*sj)+(26*(month+1)/10)+day-1)%%7
- echo 今天是%date1%; 前%ond%天是%date3% 周!w1:~%w%,1!
- goto :eof
-
- ::计算平年闰年
- :twomonth
- for /f %%a in ("year") do (set /a oldy=%%a, n=0)
- set /a a=oldy%%4,a1=oldy%%100,a2=oldy%%400
- if !a! equ 0 set n=1&if !a1! equ 0 set n=0
- if !a2! equ 0 set n=1
- if !n! equ 1 (set m2=29) else (set m2=28)
- goto :eof
复制代码
【注意:日期格式是指定的】
作者: Gin_Q 时间: 2019-12-10 19:34
今天是2019/12/10 周二; 前1天是2019/12/11 周三
今天是2019/12/10 周二; 前2天是2019/12/12 周四
今天是2019/12/10 周二; 前3天是2019/12/13 周五
今天是2019/12/10 周二; 前4天是2019/12/14 周六
今天是2019/12/10 周二; 前5天是2019/12/15 周日
今天是2019/12/10 周二; 前6天是2019/12/16 周一
今天是2019/12/10 周二; 前7天是2019/12/17 周二
今天是2019/12/10 周二; 前8天是2019/12/18 周三
今天是2019/12/10 周二; 前9天是2019/12/19 周四
今天是2019/12/10 周二; 前10天是2019/12/20 周五
今天是2019/12/10 周二; 前11天是2019/12/21 周六
今天是2019/12/10 周二; 前12天是2019/12/22 周日
今天是2019/12/10 周二; 前13天是2019/12/23 周一
今天是2019/12/10 周二; 前14天是2019/12/24 周二
今天是2019/12/10 周二; 前15天是2019/12/25 周三
今天是2019/12/10 周二; 前16天是2019/12/26 周四
今天是2019/12/10 周二; 前17天是2019/12/27 周五
今天是2019/12/10 周二; 前18天是2019/12/28 周六
今天是2019/12/10 周二; 前19天是2019/12/29 周日
今天是2019/12/10 周二; 前20天是2019/12/30 周一
今天是2019/12/10 周二; 前21天是2019/12/31 周二
今天是2019/12/10 周二; 前22天是2020/01/01 周三
今天是2019/12/10 周二; 前23天是2020/01/02 周四
作者: a20150604 时间: 2019-12-10 21:13
那么, 变量名可不可以吸呢
作者: Gin_Q 时间: 2019-12-10 21:20
本帖最后由 Gin_Q 于 2020-3-9 19:13 编辑
附一个C的- #if 0
- By Gin
- Dec-C++ 5.11
- xx.c
- #endif
- #include <stdio.h>
- #include <time.h>
- #include <stdlib.h>
-
- void date_s(int *year,int *month,int *day);
- void runnian(int *,int y);
- void loop(int *array,int y,int m,int d,int nd);
-
- int main(void)
- {
- int array[12]={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
- int nd=20000;//相差天数
- int year=0,month=0,day=0;
- date_s(&year,&month,&day);
- printf("%4d/%02d/%02d\n",year,month+1,day);
- loop(array,year,month,day,nd);
- return 0;
- }
- //计算当前日期
- void date_s(int *year,int *month,int *day)
- {
- time_t t;
- time(&t);
- struct tm *p = localtime(&t);
- *year=p->tm_year+1900;
- *month=p->tm_mon;
- *day=p->tm_mday;
- }
- //计算闰年
- void runnian(int *array,int y)
- {
- if ( y%4 == 0 && y%100 != 0) array[1]=(29);
- else if (! (y%400)) array[1]=(29);
- else array[1]=(28);
- }
- //循环天数
- void loop(int *array,int y,int m,int d,int nd)
- {
- runnian(array,y);
- int i=1;
- for (;i<=nd;i++)
- {
- if (i < d)
- {
- printf("%4d/%02d/%02d\n",y,m+1,d-i);
- continue;
- }
- else
- {
- m--;nd-=d;i=-1;
- if (m < 0)
- {
- m=11;y--;
- runnian(array,y);
- }
- d=array[m];
- }
- }
- }
复制代码
- 1965/06/12
- 1965/06/11
- 1965/06/10
- 1965/06/09
- 1965/06/08
- 1965/06/07
- 1965/06/06
-
- --------------------------------
- Process exited after 0.8944 seconds with return value 0
- 请按任意键继续. . .
复制代码
作者: Gin_Q 时间: 2019-12-10 21:48
回复 5# xczxczxcz
不会ps,了解一些批处理
作者: Gin_Q 时间: 2019-12-16 10:10
更新了一下算法,快了许多!计算连续的日期1-3000结果如下(前面开始时间——后面结束时间):
1 ===20181018= 20181017
2 ===20181018= 20181016
3 ===20181018= 20181015
...
2990 ===20181018= 20100811
2991 ===20181018= 20100810
2992 ===20181018= 20100809
2993 ===20181018= 20100808
2994 ===20181018= 20100807
2995 ===20181018= 20100806
2996 ===20181018= 20100805
2997 ===20181018= 20100804
2998 ===20181018= 20100803
2999 ===20181018= 20100802
3000 ===20181018= 20100801
10:04:51.94 ===== 10:05:50.36
单独计算3000天,结果如下:
3000 ===20181018= 20100801
10:09:59.25 ===== 10:09:59.30
作者: a20150604 时间: 2019-12-16 10:18
回复 7# Gin_Q
我也参与过这个算法的讨论
http://www.bathome.net/viewthread.php?tid=16147
作者: Gin_Q 时间: 2019-12-16 10:29
C:\Users\user>wmic cpu get name
Name
Intel(R) Celeron(R) CPU G1840 @ 2.80GHz
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |