如何在批处理文件中获取与语言环境无关的格式的日期?

如何在批处理文件中获取与语言环境无关的格式的日期?

我正在尝试读取文件名中包含日期的文件。

问题是当系统中的日期格式为美国格式时:mm/dd/yyyy它不起作用。

对于这种格式:dd/mm/yyyy它可以按预期工作。

dd/mm/yyyy即使系统设置为美国格式,我仍然需要获取这种格式的日期。

我是批处理新手,不知道如何获取所需格式的日期。

这是我的批处理文件:

for /f "delims=/ tokens=1-3" %%a in ("%date%") do (
rem Lets name our new variable "rdate" for reverse date
set _date=%%a-%%b-%%c
)

set source=%path%.csv
echo %source%
set dest=%path%_%_date%.csv
echo %dest%

答案1

解析可能采用各种您不知道的格式的日期听起来是个坏主意。最好以特定格式获取日期,即使这意味着不是纯批处理而是调用 powershell。

C:\Users\tod>for /f %a in ('C:\Windows\System32\WindowsPowershell\v1.0\powershell -Command "Get-Date -format yyyy_MM_dd__HH_mm_ss"') do set datetime=%a

C:\Users\tod>set datetime=2018_01_22__09_15_33

或没有时间。

C:\Users\tod>for /f %a in ('C:\Windows\System32\WindowsPowershell\v1.0\powershell -Command "Get-Date -format yyyy_MM_dd"') do set datetime=%a

C:\Users\tod>set datetime=2018_01_22

C:\Users\tod>

顺便说一下,年/月/日(即 yyyy/mm/dd)格式非常好,因为它在英国和美国都很容易阅读。不用担心它是否像英国那样是 dd/mm/yy。或者 mm/dd/yy。例如,您首先看到 2018,因此您知道它是年份,然后您知道年份之后是月份,然后是日期。

一旦你有了你知道的格式的日期,我建议 yyyy/mm/dd 格式,你可以这样做

C:\Users\tod>echo %datetime:~0,4%
2018

C:\Users\tod>

等等...因此,您可以将任何变量设置为等于年份、月份、月份中的日期。

添加

如果您不想使用 powershell 并且不介意这只适用于美国格式的日期。

C:\Users\tod>echo %date%
01/22/2018

C:\Users\tod>echo %date:~0,2%
01

C:\Users\tod>echo %date:~3,2%
22

C:\Users\tod>echo %date:~6,4%
2018

C:\Users\tod>

所以你应该知道怎么做

set first=%date:~0,2%

set second=%date:~3,2%

set third=%date:~6,4%


C:\Users\tod>set first=%date:~0,2%

C:\Users\tod>set second=%date:~3,2%

C:\Users\tod>set third=%date:~6,4%

C:\Users\tod>echo %first%/%second%/%third%
01/22/2018

C:\Users\tod>echo %second%/%first%/%third%
22/01/2018

C:\Users\tod>

所以你可以说set ukdate=%second%/%first%/%third% ,你可以说echo %ukdate%

而且,只有当您知道系统上的日期格式并且知道它是美国格式时,该非 powershell 方法才有效。我通常不建议使用批处理,因为例如,如果出现了新版本的操作系统,并且命令的输出有点不同,而您的代码在解析时假定了特定的格式。虽然在这种情况下,批处理在某种意义上很简洁,但有时它就像把木棍敲在一起一样。了解批处理并使用它是个好主意,但要安装一些其他脚本语言,如 Ruby、Python、Golang 或 NodeJS。但如果您想单独使用批处理,那么就这样了。

答案2

如何以与语言环境无关的格式获取批处理文件中的日期?

我需要以这种格式显示 dd/mm/yyyy

首先,不要做什么:

  • 使用%date%提供解决方案,如在其他答案中所使用的,取决于操作系统的区域设置、区域和语言设置,并且可能提供错误或缺失的信息。

  • 例如,我的电脑上的短日期格式根本不输出星期几。

解决问题的正确方法:

  • wmic另一方面,使用与操作系统区域设置、语言或用户选择的日期格式(控制面板/区域)无关。

以下批处理文件用于wmic检索日期和(本地)时间,因此不会遭受使用解决方案的缺点%date%

获取日期.cmd:

@echo off
setlocal
rem get the date
rem use findstr to strip blank lines from wmic output
for /f "usebackq skip=1 tokens=1-3" %%g in (`wmic Path Win32_LocalTime Get Day^,Month^,Year ^| findstr /r /v "^$"`) do (
  set _day=00%%g
  set _month=00%%h
  set _year=%%i
  )
rem pad day and month with leading zeros
set _month=%_month:~-2%
set _day=%_day:~-2%
rem output format required is DD/MM/YYYY
echo %_day%/%_month%/%_year%
endlocal

示例输出:

> getdate
22/01/2018

根据需要修改批处理文件以使用上述代码,例如:

@echo off
setlocal
rem get the date
rem use findstr to strip blank lines from wmic output
for /f "usebackq skip=1 tokens=1-3" %%g in (`wmic Path Win32_LocalTime Get Day^,Month^,Year ^| findstr /r /v "^$"`) do (
  set _day=00%%g
  set _month=00%%h
  set _year=%%i
  )
rem pad day and month with leading zeros
set _month=%_month:~-2%
set _day=%_day:~-2%
rem output format required is DD/MM/YYYY
set source=%path%.csv
echo %source%
set dest=%path%_%_day%/%_month%/%_year%.csv
echo %dest%
endlocal

进一步阅读

  • Windows CMD 命令行的 AZ 索引- 与 Windows cmd 行相关的所有事物的绝佳参考。
  • 对于/f- 循环命令以执行另一个命令的结果。
  • 获取日期- 显示独立于操作系统区域设置、语言或用户选择的日期格式(控制面板/区域)的日期和时间。
  • 变量- 提取变量的一部分(子字符串)。
  • 西米克- Windows 管理规范命令。

相关内容