返回列表 发帖
回复 15# idwma


    谢谢:)

TOP

BAT+WMIC获取任意格式日期时间timestamp、时区timezone

本帖最后由 Echo11 于 2022-2-23 08:22 编辑

该方案限制于WMIC,目前在win 11 22000.469 中测试。
据说未来win 11 会因安全问题去掉WMIC。
到时候想继续用WMIC,就需要在含有WMIC的系统版本中备份以下文件(不同语言需要备份对应语言的WMIC.exe.mui):
C:\Windows\System32\wbem\WMIC.exe
C:\Windows\System32\wbem\zh-CN\WMIC.exe.mui
然后按原路径还原到不含WMIC的win XX系统。
:Solu9
REM 学习以下两个链接以及子链接中内容后融合Timezone数据编写,方便任意拼接
REM 【方案2】BAT + WMIC http://bbs.bathome.net/thread-3328-2-1.html
REM stackoverflow链接 https://stackoverflow.com/questions/11037831/filename-timestamp-in-windows-cmd-batch-script-getting-truncated
@echo off
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%" & set "Ms=%dt:~15,3%"
REM Ms 毫秒,这里我取了3位,按实际需求也可以取2位或1位
set "datestamp=%YYYY%%MM%%DD%" & set "timestamp=%HH%%Min%%Sec%"
set "fullstamp=%YYYY%-%MM%-%DD%_%HH%-%Min%-%Sec%.%Ms%"
echo datestamp: "%datestamp%"
echo timestamp: "%timestamp%"
echo fullstamp: "%fullstamp%"
REM 时区 方法1 继续从dt变量获取定位时区的相关值 Bias
REM UTC 偏移 +480分钟=+08小时
set "sign=%dt:~21,1%" & set "bias=%dt:~22,3%"
set /a "bias=bias/60+100"
echo timezone: "UTC%sign%%bias:~1,2%:00"
REM 时区 方法2 直接从 wmic TimeZone get Caption /value 提取时区信息
for /f "tokens=2 delims=^(^)" %%t in ('wmic TimeZone get Caption /value') do set "timezone=%%t"
echo timezone: "%timezone%"
pause
EXIT /B 0COPY

TOP

[日期时间]批处理生成邮件头里的日期格式 (更新时间: 23 Feb 2022)

本帖最后由 Echo11 于 2022-2-23 13:08 编辑

(由于没有权限单独发帖。在此回复了。)
[日期时间]批处理生成邮件头里的日期格式 (更新时间:Wed, 23 Feb 2022 12:29:34 +0800)
如:Date: Wed, 23 Feb 2022 12:29:34 +0800

在用批处理发送邮件前需要生成“mail”本身,而mail包含mail header 和 mail content。mail header 遵从RFC 5322标准。
Win系统中无法直接获取这种格式的日期时间,因此我写了这个批处理来干这件事。



一、RFC 5322中关于日期的格式要求如下(非标准原文):
## Mail Date Reference
  date            =   day month year                 ; 应当表示本地时间
  time            =   time-of-day zone
----------------------------------------------------------------------------------------------
  day-name        =   "Mon" / "Tue" / "Wed" / "Thu" / "Fri" / "Sat" / "Sun"
  day             =   ([FWS] 1*2DIGIT FWS) / obs-day ; 一个月的第几天
  month           =   "Jan" / "Feb" / "Mar" / "Apr" /
                      "May" / "Jun" / "Jul" / "Aug" /
                      "Sep" / "Oct" / "Nov" / "Dec"
  year            =   (FWS 4*DIGIT FWS) / obs-year  ; 四位数字
----------------------------------------------------------------------------------------------
  time-of-day     =   hour ":" minute [ ":" second ] ; 应当表示本地时间, 一天中的时:分[:秒],
                                                     ; 范围00:00:00 - 23:59:60

   hour            =   2DIGIT / obs-hour

   minute          =   2DIGIT / obs-minute

   second          =   2DIGIT / obs-second

   zone            =   (FWS ( "+" / "-" ) 4DIGIT) / obs-zone
                       ; date与time-of-day偏离UTC或GMT的偏差\
                       ; +表示ahead of(即east of)UTC, -表示behind(即west of) UTC
                       ; 前两个数字表示hours偏差, 后两个数字表示minutes偏差
                       ; +hhmm表示 +(hh * 60 + mm) 分钟, -hhmm表示 -(hh * 60 + mm) 分钟
                       ; "+0000"用于表示UTC的时区
                       ; "-0000"用于表示本地时区生成的时间, date-time不包含本地时区的信息

sample:
Date: Wed, 23 Feb 2022 12:29:34 +0800



二、我的批处理
:MailDate
REM 获取以下邮件头中的日期时间
REM Date: Wed, 23 Feb 2022 12:29:34 +0800
@echo off
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "year=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "day=%dt:~6,2%" & set "time-of-day=%dt:~8,2%:%dt:~10,2%:%dt:~12,2%"
set "dn1=Mon" & set "dn2=Tue" & set "dn3=Wed" & set "dn4=Thu" & set "dn5=Fri" & set "dn6=Sat" & set "dn7=Sun"
set "mon01=Jan" & set "mon02=Feb" & set "mon03=Mar" & set "mon04=Apr" & set "mon05=May" & set "mon06=Jun" & set "mon07=Jul" & set "mon08=Aug" & set "mon09=Sep" & set "mon10=Oct" & set "mon11=Nov" & set "mon12=Dec"
setlocal enabledelayedexpansion
for /f "tokens=2 delims==" %%b in ('wmic path win32_localtime Get DayOfWeek /value') do set "dow=%%b"
set "day-name=!dn%dow%!" & set month=!mon%MM%!
for /f "tokens=2 delims=^(^)" %%t in ('wmic TimeZone Get Caption /value') do set "zone=%%t"
set "zone=!zone:U=!" & set "zone=!zone:T=!" & set "zone=!zone:C=!" & set "zone=!zone::=!"
echo.Mail Date:
echo.Date: %day-name%, %day% %month% %year% %time-of-day% %zone%
endlocal
pause>nul
EXIT /B 0COPY
三、执行结果如下:
Mail Date:
Date: Wed, 23 Feb 2022 12:43:00 +0800COPY

TOP

感谢分享。最近正好需要在英文版系统和中文版系统间切换

TOP

返回列表