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

[练习]批处理计算上个月最后一天的日期

[复制链接]
发表于 2010-3-15 19:35:34 | 显示全部楼层 |阅读模式
比如,今天是2010-03-15,运行代码之后能够输出上个月月末的日期2010-02-28。

允许使用BAT、VBS、第三方命令行工具。
发表于 2010-3-16 01:11:36 | 显示全部楼层
  1. @echo off & setlocal enabledelayedexpansion
  2. set "y=%date:~0,4%" & set "m=%date:~5,2%" & set /a "m=1!m!-101, m=m+(^!m)*12"
  3. set /a "f=^!(m-2), s=^!(m-4)|^!(m-6)|^!(m-9)|^!(m-11)" & rem 上月是否2月或小月
  4. set /a "leap=^!(y%%4) & ^!^!(y%%100) | ^!(y%%400)" & rem 今年是否闰年
  5. set /a "d=f*(28+leap)+s*30+(^!f&^!s)*31" & rem 上月有 !d! 天
  6. set /a "y1=y-^!(m-12)"
  7. set "m=0!m!" & set "m=!m:~-2!" & set "d=0!d!" & set "d=!d:~-2!"
  8. echo 上个月月末的日期是 !y1!-!m!-!d!
  9. pause
复制代码

评分

参与人数 1技术 +1 收起 理由
Hello123World + 1 果然是要把set/a学透彻吗?

查看全部评分

发表于 2010-3-16 02:36:26 | 显示全部楼层
  1. @echo off
  2. rem 调用GNU for Win32的date.exe
  3. set "gnuDate=C:\test\date.exe"
  4. for /f %%a in ('%gnuDate% "+%%Y%%m01"') do (
  5.     for /f %%h in ('%gnuDate% -d "%%a 1 days ago" "+%%Y-%%m-%%d"') do (
  6.         set "lastEndDay=%%h"
  7.     )
  8. )
  9. echo,%lastEndDay%
复制代码
发表于 2010-3-16 08:31:38 | 显示全部楼层
  1. WScript.echo DateAdd("d", -DatePart("d", Date), date)
复制代码

[ 本帖最后由 yangfengoo 于 2010-3-16 08:33 编辑 ]
发表于 2010-3-21 11:23:50 | 显示全部楼层
  1. @echo off
  2. >"%temp%\DstDate.vbs" echo strLastDate=DateAdd("d", -DatePart("d", Date), Date)
  3. >>"%temp%\DstDate.vbs" echo strFmtDate=Right(Year(strLastDate),4) ^& Right("0" ^& Month(strLastDate),2) ^& Right("0" ^& Day(strLastDate),2)
  4. >>"%temp%\DstDate.vbs" echo WScript.Echo strFmtDate
  5. for /f %%a in ('cscript /nologo "%temp%\DstDate.vbs"') do (
  6.     set "lastEndDay=%%a"
  7. )
  8. set lastEndDay=%lastEndDay:~0,4%-%lastEndDay:~4,2%-%lastEndDay:~6,2%
  9. echo,%lastEndDay%
复制代码
发表于 2010-3-21 13:48:43 | 显示全部楼层
  1. @echo off
  2. rem 调用Bill Stewart的DateX.exe
  3. set "xDate=C:\test\DateX.exe"
  4. rem 假设系统日期格式是yyyy-mm-dd
  5. set day=%date:~8,2%
  6. for /f %%a in ('"%xDate%" -o -%day%') do (
  7.     set "lastEndDay=%%a"
  8. )
  9. echo,%lastEndDay%
复制代码
发表于 2011-8-6 16:25:15 | 显示全部楼层
1.判断平润年。
2.设置1-12月最后一天的数值。
3.当前月减去1,再赋值即可。
发表于 2011-8-6 21:12:55 | 显示全部楼层
本帖最后由 CrLf 于 2011-8-7 20:17 编辑
  1. @echo off
  2. set /a "m=1%date:~5,2%-101",y=%date:~,4%-!m","m+=!m*12,"d=30+(m-m/8)%%2-!(m-2)*2-!(m-2)*(!(y%%4)&!(!(y%%100))|!(y%%400))"
  3. echo %m%月%d%日
  4. pause
复制代码
发表于 2011-8-7 19:34:33 | 显示全部楼层
本帖最后由 hanyeguxing 于 2011-8-7 19:37 编辑

回复 8# CrLf
CrLf 发表于 2011-8-6 21:12



    最好在 d= 的后面加入月份的修正计算 ,m+=!m*12

评分

参与人数 1技术 +1 收起 理由
CrLf + 1 感谢指正

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-17 02:08 , Processed in 0.019805 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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