[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[日期时间] 批处理计算日期和C计算日期

本帖最后由 Gin_Q 于 2020-3-9 19:09 编辑
  1. @echo off& color f9& title by author Gan& setlocal enabledelayedexpansion&pushd "%cd%"& rem 20:10 2019/11/23
  2. ::ond=求前xx天的日期
  3. set w1=日一二三四五六
  4. for /l %%a in (1,1,300) do call :tt %%a
  5. ::call :tt 9
  6. pause&exit
  7. :tt
  8. ::set date1=%date%&          rem 当前日期
  9.   set date1=%date%
  10.   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 平年每月天数
  11.   set /a ond=%1
  12.   set /a ond1=%ond%
  13.   set date2=%date1%
  14.   set year=%date1:~0,4%
  15. :yyr
  16.   for /f "tokens=1-3 delims=\/: " %%a in ("%date2%") do (set /a year=%%a, oldm=1%%b%%100, day=1%%c%%100)
  17.   call :twomonth
  18. :lri
  19.   set /a ri=m!oldm!-day
  20.   if !ond! leq !ri! (set /a day+=ond& goto:zhou)
  21.   set /a ond1-=ri, oldm+=1
  22. :loop
  23.   set /a n=1
  24.   for /l %%a in (1,1,!n!) do ( set /a day=0
  25.   if !oldm! gtr 12 set /a oldm=1, year+=1& call :twomonth
  26. ::rem 每月天数  
  27.   set /a oldmd=m!oldm!
  28.   if !ond1! leq !oldmd! (set /a day+=ond1) else (set /a ond1-=oldmd, oldm+=1& goto :loop))
  29. :zhou
  30. ::rem 计算星期
  31.   if %oldm% lss 10 set oldm=0%oldm%
  32.   if %day% lss 10 set day=0%day%
  33.   set date3=!year!/%oldm%/%day%
  34.   for /f "tokens=1-3 delims=\/: " %%a in ("%date3%") do (set /a year=%%a, month=1%%b%%100, day=1%%c%%100)
  35.   set y2=%year:~2,2%
  36.   set /a sj= year/100
  37.   if %month% equ 1 set /a month=13, year-=1, sj=!year!/100& set y2=!year:~2,2!
  38.   if %month% equ 2 set /a month=14, year-=1, sj=!year!/100& set y2=!year:~2,2!
  39.   set /a w=(y2+y2/4+sj/4+(-2*sj)+(26*(month+1)/10)+day-1)%%7
  40.   echo 今天是%date1%; 前%ond%天是%date3% 周!w1:~%w%,1!
  41.   goto :eof
  42. ::计算平年闰年
  43. :twomonth
  44.   for /f %%a in ("year") do (set /a oldy=%%a, n=0)
  45.   set /a a=oldy%%4,a1=oldy%%100,a2=oldy%%400
  46.   if !a! equ 0 set n=1&if !a1! equ 0 set n=0
  47.   if !a2! equ 0 set n=1
  48.   if !n! equ 1 (set m2=29) else (set m2=28)
  49.   goto :eof
复制代码
【注意:日期格式是指定的】

今天是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 周四

TOP

那么, 变量名可不可以吸呢

TOP

本帖最后由 Gin_Q 于 2020-3-9 19:13 编辑

附一个C的
  1. #if 0
  2. By Gin
  3. Dec-C++ 5.11
  4. xx.c
  5. #endif
  6. #include <stdio.h>
  7. #include <time.h>
  8. #include <stdlib.h>
  9. void date_s(int *year,int *month,int *day);
  10. void runnian(int *,int y);
  11. void loop(int *array,int y,int m,int d,int nd);
  12. int main(void)
  13. {
  14. int array[12]={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  15. int nd=20000;//相差天数
  16. int year=0,month=0,day=0;
  17. date_s(&year,&month,&day);
  18. printf("%4d/%02d/%02d\n",year,month+1,day);
  19. loop(array,year,month,day,nd);
  20. return 0;
  21. }
  22. //计算当前日期
  23. void date_s(int *year,int *month,int *day)
  24. {
  25. time_t t;
  26. time(&t);
  27. struct tm *p = localtime(&t);
  28. *year=p->tm_year+1900;
  29. *month=p->tm_mon;
  30. *day=p->tm_mday;
  31. }
  32. //计算闰年
  33. void runnian(int *array,int y)
  34. {
  35. if ( y%4 == 0 && y%100 != 0) array[1]=(29);
  36. else if (! (y%400)) array[1]=(29);
  37. else array[1]=(28);
  38. }
  39. //循环天数
  40. void loop(int *array,int y,int m,int d,int nd)
  41. {
  42. runnian(array,y);
  43. int i=1;
  44. for (;i<=nd;i++)
  45. {
  46. if (i < d)
  47. {
  48. printf("%4d/%02d/%02d\n",y,m+1,d-i);
  49. continue;
  50. }
  51. else
  52. {
  53. m--;nd-=d;i=-1;
  54. if (m < 0)
  55. {
  56. m=11;y--;
  57. runnian(array,y);
  58. }
  59. d=array[m];
  60. }
  61. }
  62. }
复制代码
  1. 1965/06/12
  2. 1965/06/11
  3. 1965/06/10
  4. 1965/06/09
  5. 1965/06/08
  6. 1965/06/07
  7. 1965/06/06
  8. --------------------------------
  9. Process exited after 0.8944 seconds with return value 0
  10. 请按任意键继续. . .
复制代码

TOP

回复 5# xczxczxcz

不会ps,了解一些批处理

TOP

更新了一下算法,快了许多!计算连续的日期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

TOP

回复 7# Gin_Q

我也参与过这个算法的讨论
http://www.bathome.net/viewthread.php?tid=16147

TOP

C:\Users\user>wmic cpu  get name
Name
Intel(R) Celeron(R) CPU G1840 @ 2.80GHz

TOP

返回列表