比较Windows批处理文件中的2个日期

时间:2013-07-15 07:52:11

标签: windows date if-statement batch-file cmd

如何比较批处理文件中的2个日期? 这样:

if %%newdate geq %olddate%  _do smth_

不起作用。

在这种情况下,我有27.05.2013 大于 15.07.2013而且14.07.2013 小于< / em> 15.07.2013

枕亚

5 个答案:

答案 0 :(得分:6)

试试这个:

set "sdate1=%olddate:~-4%%olddate:~3,2%%olddate:~0,2%"
set "sdate2=%newdate:~-4%%newdate:~3,2%%newdate:~0,2%"
if %sdate1% GTR %sdate2% (goto there)  else echo here

答案 1 :(得分:1)

call :date_to_number %date1% date1
call :date_to_number %date2% date2

if %date1% GEQ %date2% echo date1 is bigger

goto :eof
:date_to_number
setlocal
if "%~1" EQU "" goto :eof
for /f "tokens=1,2,3 delims=." %%D in ("%~1") do (
  set "the_date=%%F%%E%%D"   
)
endlocal & if "%~2" neq "" (set %~2=%the_date%) else echo %the_date%
goto :eof

但这只适用于格式为DD.MM.YYYY

的日期

答案 2 :(得分:0)

我遇到一个问题,我想查找密码已过期或即将过期的用户。

因此对于初学者来说,Windows 10已更改%date%变量的格式,因此它看起来与以前的版本不同。因此,“ echo%date%”的输出如下所示: “ 19年5月9日星期四” 所以我用这只衬纸取今天的日期并将其转换为yyyymmdd格式。

set today=20%date:~-2%%date:~4,2%%date:~7,2%

(今天= 20190509)

这很容易,因为我们知道每个月和一天中都有2位数字。

现在,如果您使用的“日期格式”没有用前一个零填充数字月和日,则您必须自己填充它们。 例如,命令的输出:净用户%username%/ domain看起来像“ 5/9/19”,请注意缺少的零...

因此,您可以采用几种不同的方式提取它。最简单的方法是分别获取每个字段,在月和日变量前添加零,然后仅获取它们的最后两位。 这样5变成05,而12变成012,然后又回到12。

for /f "tokens=3-5 delims=/ " %%a in ('net user %username% /domain ^|find /i "Password expires"') do (
set mm=0%%a& set dd=0%%b& set yyyy=20%%c
set expires=!yyyy!!mm:~-2!!dd:~-2!
if NOT !expires! GTR %today% echo Password has expired and needs to be changed. 

答案 3 :(得分:0)

对于日期,您应始终使用ISO格式(yyyy-MM-dd HH:mm:ss)。这样一来,您就可以清楚地了解其语言环境,并且按时间顺序对其进行排序,并且您可以轻松地将它们作为CMD文件中的字符串进行比较。

For /F "tokens=1,2 delims==" %%i in ('wmic os get LocalDateTime /VALUE') do (if .%%i EQU .LocalDateTime set ldt=%%j)
set CURRENT_DATE=%ldt:~0,4%-%ldt:~4,2%-%ldt:~6,2%
set CURRENT_TIME=%ldt:~8,2%:%ldt:~10,2%:%ldt:~12,2%

这将为您提供:

CURRENT_DATE in yyyy-MM-dd format
CURRENT_TIME in HH:mm:ss format

答案 4 :(得分:-1)

I create a simple c program i call newest.exe. Below is the source code.

#include <stdio.h>
#include <sys/stat.h>
#include <time.h>

// syntax:  newest file1 file2
//
//   if age1 = age2, prints  0 age1 age2
//   if age1 < age2, prints  1 age1 age2
//   if age1 > age2, prints  2 age1 age2
//   where
//      age1 is age of file1 is seconds.
//      age2 is age of file2 is seconds.
//
//   To capture the output in a DOS bat file use:
//      for /f "tokens=1-3" %%i in ('%srcPath%\newest.exe %src% %des%') do (
//         set newest=%%i
//         set age1=%%j
//         set age2=%%k
//      )


int main(int argc, char **argv)
{
   struct stat fileStat;
   time_t now;
   long age1, age2;

   if(argc != 3)
   {
      printf("syntax: %s File1 File2\n", argv[0]);
      return 1;
   }

   now = time(NULL);

   if(stat(argv[1],&fileStat) < 0) return 1;
   age1 = now - fileStat.st_mtime;

   if(stat(argv[2],&fileStat) < 0) return 1;
   age2 = now - fileStat.st_mtime;

   if( age1 == age2 )
      printf("0 %d %ld\n", age1, age2);
   else if( age1 < age2 )
      printf("1 %d %ld\n", age1, age2);
   else
      printf("2 %d %ld\n", age1, age2);

   return 0;
}