找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 28124|回复: 9

[日期时间] 批处理或PowerShell如何列举指定两个日期之间的所有月份?

[复制链接]
发表于 2016-6-22 08:06:51 | 显示全部楼层 |阅读模式
本帖最后由 pcl_test 于 2016-7-17 22:58 编辑

例如,开始月份是:
201510

结束月份是:
201603

希望得到:
201511
201512
201601
201602
发表于 2016-6-22 08:22:38 | 显示全部楼层
本帖最后由 codegay 于 2016-6-22 09:26 编辑


迭代月份+1 直到大于等于目标月份。
发表于 2016-6-22 09:41:36 | 显示全部楼层
百度知道上的python2代码,取区间日期。
  1. # -*- coding: utf-8 -*-
  2. import datetime
  3. date1=datetime.datetime.strptime('2014-09-20','%Y-%m-%d')
  4. date2=datetime.datetime.strptime('2014-10-04','%Y-%m-%d')
  5. i=datetime.timedelta(days=1)
  6. while i<(date2-date1):
  7.     print (date1+i).strftime('%Y-%m-%d')
  8.     i+=datetime.timedelta(days=1)
复制代码
另一个思路是使用区间库、或者是序列数值生成器之类的,总之能自动计算并返回一系列数据的工具。
参考这个帖子:http://stackoverflow.com/questio ... -of-dates-in-python
pandas
matplotlib
之类这些科学计算或者数据分析之类的库都集成了类似的功能。
发表于 2016-6-22 11:11:33 | 显示全部楼层
本帖最后由 happy886rr 于 2016-6-22 11:12 编辑

回复 1# GNU
请在命令行下使用,类似第三方用法。
示例:
  1. i.cmd 201510 201603
  2. REM 显示结果:
  3. 201511
  4. 201512
  5. 201601
  6. 201602
复制代码
i.cmd代码:
  1. @echo off&setlocal enabledelayedexpansion
  2. set A=%1&set B=%2
  3. if "%1"=="" (echo;用法示例:&set/p=%~nx0 [开始年月] [结束年月]&exit)
  4. set/a y=!B:~0,4!-!A:~0,4!+1
  5. set/a m=1!B:~-2!-1!A:~-2!-1
  6. if !m! lss 0 (set/a "m+=12,y-=1")
  7. for /l %%i in (0 1 !y!) do (
  8.         if %%i gtr 0 (if %%i lss !y! (set/a CYC=12) else (set/a CYC=m))
  9.         for /l %%j in (1 1 !CYC!) do (
  10.                 set/a mm=%%j+1!A:~-2!
  11.                 set/a yy=%%i+!A:~0,4!-1
  12.                 if !mm! gtr 112 (set/a "mm-=12,yy+=1")
  13.                 echo !yy!!mm:~-2!
  14.         )
  15. )
复制代码
发表于 2016-6-22 12:55:35 | 显示全部楼层
本帖最后由 pcl_test 于 2016-6-22 13:05 编辑

powershell举个栗子
  1. $d1='201510'
  2. $d2='201603'
  3. $formatProvider = [Globalization.CultureInfo]::InvariantCulture
  4. while($d1 -ne $d2)
  5. {
  6.     $t=[datetime]::ParseExact($d1,'yyyyMM',$formatProvider)
  7.     $d1=$t.AddMonths(1).toString('yyyyMM')
  8.     $d1
  9. }
复制代码
发表于 2016-6-22 13:08:32 | 显示全部楼层
本帖最后由 WHY 于 2016-6-30 22:59 编辑
  1. @echo off
  2. set "d=201510"

  3. :Loop
  4. set /a m=d%%100, y=d/100+m/12, m=m%%12+101
  5. set "d=%y%%m:~1%"
  6. if %d% LSS 201612 echo;%d%&goto :Loop
  7. pause
复制代码
  1. $d = [DateTime]'2015/10/1'
  2. while(1){
  3.     $d = $d.AddMonths(1);
  4.     if([int]$d.ToString('yyyyMM') -ge 201612){break}
  5.     $d.ToString('yyyyMM')
  6. }
复制代码
 楼主| 发表于 2016-6-22 14:44:18 | 显示全部楼层
回复 6# WHY


    要求的是个开区间,最后的201612应该排除掉。
发表于 2016-6-22 15:47:27 | 显示全部楼层
回复 7# GNU


    改了
发表于 2016-6-24 16:43:54 | 显示全部楼层
另类解:
  1. @echo off & setlocal enabledelayedexpansion
  2. if "%~1" == "1" (
  3.     for /l %%i in (201510 1 201612) do set /a n=%%i-1 & echo;!n!
  4. ) else (
  5.     "%~f0" 1 | more +2 | findstr /e "0[1-9] 1[012]" & pause
  6. )
复制代码
  1. $a=201510..201612; $a[1..($a.length-2)] -match '(0[1-9]|1[012])$'
复制代码
发表于 2016-6-24 21:51:31 | 显示全部楼层
一个FOR里处理了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-21 10:29 , Processed in 0.029032 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表