标题: [日期时间] 批处理或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代码,取区间日期。- # -*- coding: utf-8 -*-
- import datetime
- date1=datetime.datetime.strptime('2014-09-20','%Y-%m-%d')
- date2=datetime.datetime.strptime('2014-10-04','%Y-%m-%d')
- i=datetime.timedelta(days=1)
- while i<(date2-date1):
- print (date1+i).strftime('%Y-%m-%d')
- 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
请在命令行下使用,类似第三方用法。
示例:- i.cmd 201510 201603
- REM 显示结果:
- 201511
- 201512
- 201601
- 201602
复制代码
i.cmd代码:- @echo off&setlocal enabledelayedexpansion
- set A=%1&set B=%2
- if "%1"=="" (echo;用法示例:&set/p=%~nx0 [开始年月] [结束年月]&exit)
- set/a y=!B:~0,4!-!A:~0,4!+1
- set/a m=1!B:~-2!-1!A:~-2!-1
- if !m! lss 0 (set/a "m+=12,y-=1")
- for /l %%i in (0 1 !y!) do (
- if %%i gtr 0 (if %%i lss !y! (set/a CYC=12) else (set/a CYC=m))
- for /l %%j in (1 1 !CYC!) do (
- set/a mm=%%j+1!A:~-2!
- set/a yy=%%i+!A:~0,4!-1
- if !mm! gtr 112 (set/a "mm-=12,yy+=1")
- echo !yy!!mm:~-2!
- )
- )
复制代码
作者: pcl_test 时间: 2016-6-22 12:55
本帖最后由 pcl_test 于 2016-6-22 13:05 编辑
powershell举个栗子- $d1='201510'
- $d2='201603'
- $formatProvider = [Globalization.CultureInfo]::InvariantCulture
- while($d1 -ne $d2)
- {
- $t=[datetime]::ParseExact($d1,'yyyyMM',$formatProvider)
- $d1=$t.AddMonths(1).toString('yyyyMM')
- $d1
- }
复制代码
作者: WHY 时间: 2016-6-22 13:08
本帖最后由 WHY 于 2016-6-30 22:59 编辑
- @echo off
- set "d=201510"
-
- :Loop
- set /a m=d%%100, y=d/100+m/12, m=m%%12+101
- set "d=%y%%m:~1%"
- if %d% LSS 201612 echo;%d%&goto :Loop
- pause
复制代码
- $d = [DateTime]'2015/10/1'
- while(1){
- $d = $d.AddMonths(1);
- if([int]$d.ToString('yyyyMM') -ge 201612){break}
- $d.ToString('yyyyMM')
- }
复制代码
作者: GNU 时间: 2016-6-22 14:44
回复 6# WHY
要求的是个开区间,最后的201612应该排除掉。
作者: WHY 时间: 2016-6-22 15:47
回复 7# GNU
改了
作者: WHY 时间: 2016-6-24 16:43
另类解:- @echo off & setlocal enabledelayedexpansion
- if "%~1" == "1" (
- for /l %%i in (201510 1 201612) do set /a n=%%i-1 & echo;!n!
- ) else (
- "%~f0" 1 | more +2 | findstr /e "0[1-9] 1[012]" & pause
- )
复制代码
- $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 |