【问题标题】:Batch script date into variable批处理脚本日期到变量
【发布时间】:2011-04-08 11:00:47
【问题描述】:
for /F "tokens=1-4 delims=/ " %%i in ('date /t') do (
set Day=%%k
set Month=%%j
set Year=%%l
set DATE=%%k/%%j/%%l)

我正在尝试将日期放入批处理脚本中的上述变量中​​,但目前日期显示为

2011/04/

关于如何解决此问题的任何建议?

【问题讨论】:

  • 我得到 DATE=04/08/2011 - 它基于您的 Windows 设置,不是吗?

标签: variables batch-file


【解决方案1】:

您没有得到预期结果,因为%DATE% 使用“短日期格式”的 Windows 设置返回当前日期。此设置是完全(无限)可定制的。

用户可以将其系统配置为将短日期显示为 Fri040811;而另一个用户(即使在同一系统中)可能会选择 08/04/2011。对于 BAT 程序员来说,这是一场彻头彻尾的噩梦。

一种可能的解决方案是改用 WMIC。 WMIC 是 WMI 的 WMI 命令行界面。 WMI Windows Management Instrumentationhttp://en.wikipedia.org/wiki/Windows_Management_Instrumentation

WMIC Path Win32_LocalTime Get Day,Hour,Minute,Month,Second,Year /Format:table

以方便的方式返回日期以直接使用FOR 解析它。

完成解析并将各个部分放在一起

 FOR /F "skip=1 tokens=1-6" %%A IN ('WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') DO (
    SET /A TODAY=%%F*10000+%%D*100+%%A
 )

【讨论】:

  • 或者:for /f %%a in ('wmic os get LocalDateTime ^| findstr ^[0-9]') do (set ts=%%a) & set datetime=%ts:~0,8%-%ts:~8,4%(这在荷兰现在有一个20120623-1617,因此丢弃任何时区)。
  • @Arjan:我在 AUS 得到了 "~0,8ts:~8,4",在 CMD 中使用了这个 %date% 格式:27/11/2012
  • @PA 这行得通,但我在 AUS 设置上收到“缺少操作数”错误(CMD 中的 %date% 格式:27/11/2012)。它输出 C:--->(SET /A today=2012*10000+11*100+27 ) )---->(SET /A today=*10000+*100+ 缺少操作数。
  • 这个:serverfault.com/questions/227345/… 对我来说效果很好。
【解决方案2】:

我从已经给出的解决方案中得出最短的。这适用于所有系统(XP Pro 及更高版本):

REM ===================================================================
REM CREATE UNIQUE DATETIME STRING IN FORMAT YYYYMMDD-HHMMSS
REM ======================================================================
FOR /f %%a IN ('WMIC OS GET LocalDateTime ^| FIND "."') DO SET DTS=%%a
SET DateTime=%DTS:~0,8%-%DTS:~8,6%
REM ======================================================================

当然,您可以使用生成的字符串格式。

【讨论】:

    【解决方案3】:

    我想这就是你想要的:

    @echo off
    :MENU
    CLS
    for /f "delims=" %%a in ('wmic OS Get localdatetime  ^| find "."') do set xsukax=%%a
    echo Year=%xsukax:~0,4%
    echo Month=%xsukax:~4,2%
    echo Day=%xsukax:~6,2%
    echo hour=%xsukax:~8,2%
    echo Minutes=%xsukax:~10,2%
    echo seconds=%xsukax:~12,2%
    
    pause
    goto MENU
    

    【讨论】:

      【解决方案4】:

      这是我在 XP pro 机器和更高版本中使用的。 XP Home 没有 wmic。

      :: 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
      

      【讨论】:

      • 我在 Windows7 环境中使用了这个。我必须补充一点,无论本地设置如何,它都会给出相同的结果,不涉及数学,它包括时间。
      【解决方案5】:

      您可以随意使用它

      :: Date in year, day, month format
      
      FOR /f "tokens=2-4 skip=1 delims=(-)" %%G IN ('echo.^|date') DO (
          FOR /f "tokens=2 delims= " %%A IN ('date /t') DO (
              SET v_first=%%G
              SET v_second=%%H
              SET v_third=%%I
              SET v_all=%%A
              )
          )
      
      SET %v_first%=%v_all:~0,2%
      SET %v_second%=%v_all:~3,2%
      SET %v_third%=%v_all:~6,4%
      SET DATE2= %MM%_%DD%_%YY%
      ECHO. The date is: %DATE2%
      

      【讨论】:

        【解决方案6】:

        您不能简单地使用以下 1 行来创建您的 var(使用任何 var 名称)吗?

        set ymd=%date:~6,4%/%date:~0,2%/%date:~3,2%
        

        【讨论】:

        • 这取决于区域设置和 %date% 输出的格式,它是可变的。不过,只要没有人使用日期设置,它就可以在单台机器上正常工作。
        【解决方案7】:
        for /f %%a in ('wmic os get localdatetime ^| find "."') do set dts=%%a
        set ymd=%dts:~0,8%
        set hour=%dts:~8,6%
        

        【讨论】:

          【解决方案8】:

          以下脚本将以真正的 ISO8601 和人类格式(没有“T”)提供本地时间和时区 (TZ) 信息。它以分钟为单位将 TZ 偏移量转换为所需的 HHMM 格式,例如2019-01-25T08:26:55.347+13002019-01-25 08:26:55.347+1300 新西兰,夏令时。

          @echo off
          for /F "usebackq tokens=1,2 delims==" %%i in (`wmic os get LocalDateTime /VALUE 2^>NUL`) do if '.%%i.'=='.LocalDateTime.' set ldt=%%j
          set ccyy_mm_dd=%ldt:~0,4%-%ldt:~4,2%-%ldt:~6,2%
          set hh_mm_ss=%ldt:~8,2%:%ldt:~10,2%:%ldt:~12,2%
          set _fff=%ldt:~14,4%
          set tzsign=%ldt:~21,1%
          set tzmins=%ldt:~22%
          set /a tzHH=(%tzmins%/60)
          set /a tzMM=(%tzmins%-(%tzHH%*60))
          set /a tzHH=100 + %tzHH%
          set tzHH=%tzHH:~1,2%
          set /a tzMM=100 + %tzMM%
          set tzMM=%tzMM:~1,2%
          set ldt=%ccyy_mm_dd% %hh_mm_ss%%_fff%%tzsign%%tzHH%%tzMM%
          set ldt8601=%ccyy_mm_dd%T%hh_mm_ss%%_fff%%tzsign%%tzHH%%tzMM%
          echo %ldt%
          echo %ldt8601%
          

          您可能想要删除其中一个回显命令

          编辑对于那些想要在 TZ 中使用冒号的人,将 %tzHH%%tzMM% 更改为 %tzHH%:%tzMM%

          【讨论】:

            猜你喜欢
            • 2012-01-26
            • 1970-01-01
            • 2011-02-10
            • 1970-01-01
            • 2015-05-08
            • 1970-01-01
            • 2015-02-28
            • 1970-01-01
            • 2019-08-16
            相关资源
            最近更新 更多