Board logo

标题: [日期时间] 批处理或PowerShell如何列举指定两个日期之间的所有月份? [打印本页]

作者: GNU    时间: 2016-6-22 08:06     标题: 批处理或PowerShell如何列举指定两个日期之间的所有月份?

本帖最后由 pcl_test 于 2016-7-17 22:58 编辑

例如,开始月份是:
201510

结束月份是:
201603

希望得到:
201511
201512
201601
201602
作者: codegay    时间: 2016-6-22 08:22

本帖最后由 codegay 于 2016-6-22 09:26 编辑


迭代月份+1 直到大于等于目标月份。
作者: codegay    时间: 2016-6-22 09:41

百度知道上的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
之类这些科学计算或者数据分析之类的库都集成了类似的功能。
作者: happy886rr    时间: 2016-6-22 11:11

本帖最后由 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. )
复制代码

作者: pcl_test    时间: 2016-6-22 12:55

本帖最后由 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. }
复制代码

作者: WHY    时间: 2016-6-22 13:08

本帖最后由 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. }
复制代码

作者: GNU    时间: 2016-6-22 14:44

回复 6# WHY


    要求的是个开区间,最后的201612应该排除掉。
作者: WHY    时间: 2016-6-22 15:47

回复 7# GNU


    改了
作者: WHY    时间: 2016-6-24 16:43

另类解:
  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])$'
复制代码

作者: terse    时间: 2016-6-24 21:51

一个FOR里处理了




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2