试图找出MM / DD / YYYY与DD / MM / YYYY

时间:2013-06-06 03:43:59

标签: batch-file

我需要弄清楚当前日期6/6/2013是否为MM / DD / YYYY与DD / MM / YYYY格式。因此他们都是“6”。

我要做的是拿当前日期然后再添加3天,从那里我会知道哪一个是MM字段,因为它不会改变。我不知道如何批量打印日期+ 3天。它甚至可能吗?有没有人有任何想法?我已经在这里待了几个小时。我试图使用GNU date命令,但我必须指定输出,所以它没有帮助.. GRR!

注意,这适用于WINDOWS。 请注意,我正在查看的文件无法更改,因此如果日期是2013年9月9日,那么我必须使用它来确定字段。

编辑:我最终使用以下代码: 它有点完成,但你可以看到我基本上是这样做的。我设置值的原因是因为我将它与Gnu date.exe命令结合使用,该命令非常适合根据特定日期提供日期。所以脚本中的其他地方我使用它如下:date.exe - 日期“现在-90天”%DATEFORMAT%。我不得不抛弃另一篇文章中建议的日期/ T选项,因为这实际上并没有显示所有情况下的正确数据。

for /F "skip=1 tokens=3" %%a in ('reg query "HKCU\Control Panel\International" /v sShortDate ^< NUL') do (
    echo.%%a|findstr /C:"/" >nul 2>&1 && set DELIM=/
    echo.%%a|findstr /C:"-" >nul 2>&1 && set DELIM=-
    echo.%%a|findstr /C:"." >nul 2>&1 && set DELIM=.

    for /F "tokens=1-3 delims=-/." %%b in ("%%a") do (
        set format=%%b%%c%%d
    )
)

if %DELIM%==/ ( 
    :: US English options 
    if %format%==Mdyyyy set DATEFORMAT=+%%-m/%%-d/%%Y 
    if %format%==Mdyy set DATEFORMAT=+%%-m/%%-d/%%y
    if %format%==MMddyy set DATEFORMAT=+%%m/%%d/%%y
    if %format%==MMddyyyy set DATEFORMAT=+%%m/%%d/%%Y
    if %format%==yyMMdd set DATEFORMAT=+%%y/%%m/%%d 

    :: UK English options
    if %format%==ddMMyyyy set DATEFORMAT=+%%d/%%m/%%Y
    if %format%==ddMMyy set DATEFORMAT=+%%d/%%m/%%y
    if %format%==dMyy set DATEFORMAT=+%%-d/%%-m/%%y

) else if %DELIM%==- (
    if %format%==yyyyMMdd set DATEFORMAT=+%%Y-%%m-%%d
    if %format%==ddMMMyy set DATEFORMAT=+%%d/%%m/%%y
    if %format%==dMyy set DATEFORMAT=+%%-d-%%-m-%%y
) else if %DELIM%==. (
    if %format%==dMyy set DATEFORMAT=+%%-d.%%-m.%%y
) else (
    echo ERROR: System was unable to identify dateformat.
    ping -n 10 -w 1 127.0.0.1 >NUL
)

5 个答案:

答案 0 :(得分:5)

要批量获取当前日期格式,请尝试以下操作:

@echo off&setlocal
reg query "HKCU\Control Panel\International" /v sShortDate

..输出(可能会有所不同):

 sShortDate  REG_SZ  M/d/yyyy

答案 1 :(得分:2)

了解区域设置日期格式的一种简单方法是使用date命令的输入格式,该格式与%date%输出格式相同变量。例如,当我在计算机中执行date时,我得到了这个输出:

The current date is: 06/06/2013
Enter the new date: (dd-mm-yy)

所以诀窍是获取最后一部分(dd-mm-yy)并处理它:

for /F "skip=1 tokens=2 delims=()" %%a in ('date ^< NUL') do (
   for /F "tokens=1-3 delims=-/." %%b in ("%%a") do (
      for /F "tokens=1-3 delims=-/." %%x in ("%date%") do (
         set "%%b=%%x" & set "%%c=%%y" & set "%%d=%%z"
      )
   )
)
echo Day: %dd%, Month: %mm%, Year: %yy%

对于“日期+ 3天”部分,您可以将日期转换为Julian Day Number,为其添加3并将数字转换回日期,但有更简单的解决方案:

@echo off
setlocal EnableDelayedExpansion

for /F "skip=1 tokens=2 delims=()" %%a in ('date ^< NUL') do (
   for /F "tokens=1-3 delims=-/." %%b in ("%%a") do (
      for /F "tokens=1-3 delims=-/." %%x in ("%date%") do (
         set /A %%b=1%%x %% 100, %%c=1%%y %% 100, %%d=%%z
      )
   )
)
echo Today's date. Day: %dd%, Month: %mm%, Year: %yy%

set m=0
for %%a in (31 28 31 30 31 30 31 31 30 31 30 31) do (
   set /A m+=1
   set daysPerMonth[!m!]=%%a
)
set /A yyMOD4=yy %% 4
if %yyMOD4% equ 0 set daysPerMonth[2]=29

rem Add 3 days to today's date
set /A dd+=3
if %dd% gtr !daysPerMonth[%mm%]! (
   set /A dd-=daysPerMonth[%mm%], mm+=1
   if !mm! gtr 12 (
      set /A mm=1, yy+=1
   )
)
if %dd% lss 10 set dd=0%dd%
if %mm% lss 10 set mm=0%mm%

echo Today + 3 days date. Day: %dd%, Month: %mm%, Year: %yy%

答案 2 :(得分:2)

对不起,我对这个话题感到有点困惑。

在您的原始问题中,您需要“确定当前日期是否为MM / DD / YYYY与DD / MM / YYYY格式”,因为您将“获取当前日期然后再添加3天”。在我的第一个回答中,我解决了之前请求的两个点(我认为正确)。但是,您最终使用的代码似乎解决了一个完全不同的问题:将语言环境日期格式转换为特定的特定日期格式。如果这是新请求,那么这是我的新解决方案:

@echo off
setlocal EnableDelayedExpansion

rem Get the date format
for /F "skip=1 tokens=3" %%a in ('reg query "HKCU\Control Panel\International" /v 

sShortDate ^< NUL') do (
   set DATEFORMAT=%%a
)

rem Convert the special case: dd-MMM-yy to +%%d/%%m/%%y
if %DATEFORMAT% equ dd-MMM-yy (
   set DATEFORMAT=+%%d/%%m/%%y
) else (
   rem Convert the rest of cases
   for %%a in ("yyyy=%%Y" "yy=%%y" "MM=%%x" "M=%%-x" "x=m" "dd=%%x" "d=%%-x" "x=d") do (
      set DATEFORMAT=!DATEFORMAT:%%~a!
   )
)
set DATEFORMAT=+!DATEFORMAT!

ECHO %DATEFORMAT%

日期管理例程对我很重要,所以如果您可以测试此解决方案并报告它是否正确转换日期格式或指向任何转换错误,我将不胜感激。非常感谢...

答案 3 :(得分:1)

这是获取时间戳的区域不敏感方式 - Win XP Pro及更高版本。

目前下面有YYYYMMDD_HHMMSS和YYYY-MM-DD_HH-MM-SS。您可以更改项目的顺序以获得所需的时间戳。

:: timestamp YYYYMMDD_HHMMSS
@echo off
for /f "delims=" %%a in ('wmic OS Get localdatetime  ^| find "."') do set dt=%%a
set dt=%dt:~0,8%_%dt:~8,6%
echo %dt%
pause

和一个可以重新排列的个别项目:

:: timestamp YYYY-MM-DD_HH-MM-SS
@echo off
for /f "delims=" %%a in ('wmic OS Get localdatetime  ^| find "."') do set dt=%%a
set dt=%dt:~0,4%-%dt:~4,2%-%dt:~6,2%_%dt:~8,2%-%dt:~10,2%-%dt:~12,2%
echo %dt%
pause

答案 4 :(得分:0)

如果您使用的是Windows,则可以单步执行C:\Windows\Temp文件夹中的文件,直至找到具有day&gt;的文件。 12.这是我写的一个批处理文件,演示了一种可以执行此操作的方法。您可以在另一个操作系统上采用类似的方法,但我不知道语法...

@echo off

setlocal

for /f "tokens=1,2,3,4* delims=/ " %%i in ('dir c:\windows\temp /4 ^| find "M   "') do (
  if %%i gtr 2000 (if %%j gtr 12 (set _format=YYYY/DD/MM) else (if %%k gtr 12 (set _format=YYYY/MM/DD)))
  if %%j gtr 2000 (if %%i gtr 12 (set _format=DD/YYYY/MM) else (if %%k gtr 12 (set _format=MM/YYYY/DD)))
  if %%k gtr 2000 (if %%i gtr 12 (set _format=DD/MM/YYYY) else (if %%j gtr 12 (set _format=MM/DD/YYYY)))
  if defined _format goto :TheEnd
)

:TheEnd
echo %_format%

endlocal