[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
回复 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系统。
  1. :Solu9
  2. REM 学习以下两个链接以及子链接中内容后融合Timezone数据编写,方便任意拼接
  3. REM 【方案2】BAT + WMIC http://bbs.bathome.net/thread-3328-2-1.html
  4. REM stackoverflow链接 https://stackoverflow.com/questions/11037831/filename-timestamp-in-windows-cmd-batch-script-getting-truncated
  5. @echo off
  6. for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
  7. set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
  8. set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%" & set "Ms=%dt:~15,3%"
  9. REM Ms 毫秒,这里我取了3位,按实际需求也可以取2位或1位
  10. set "datestamp=%YYYY%%MM%%DD%" & set "timestamp=%HH%%Min%%Sec%"
  11. set "fullstamp=%YYYY%-%MM%-%DD%_%HH%-%Min%-%Sec%.%Ms%"
  12. echo datestamp: "%datestamp%"
  13. echo timestamp: "%timestamp%"
  14. echo fullstamp: "%fullstamp%"
  15. REM 时区 方法1 继续从dt变量获取定位时区的相关值 Bias
  16. REM UTC 偏移 +480分钟=+08小时
  17. set "sign=%dt:~21,1%" & set "bias=%dt:~22,3%"
  18. set /a "bias=bias/60+100"
  19. echo timezone: "UTC%sign%%bias:~1,2%:00"
  20. REM 时区 方法2 直接从 wmic TimeZone get Caption /value 提取时区信息
  21. for /f "tokens=2 delims=^(^)" %%t in ('wmic TimeZone get Caption /value') do set "timezone=%%t"
  22. echo timezone: "%timezone%"
  23. pause
  24. EXIT /B 0
复制代码

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



二、我的批处理
  1. :MailDate
  2. REM 获取以下邮件头中的日期时间
  3. REM Date: Wed, 23 Feb 2022 12:29:34 +0800
  4. @echo off
  5. for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
  6. 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%"
  7. set "dn1=Mon" & set "dn2=Tue" & set "dn3=Wed" & set "dn4=Thu" & set "dn5=Fri" & set "dn6=Sat" & set "dn7=Sun"
  8. 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"
  9. setlocal enabledelayedexpansion
  10. for /f "tokens=2 delims==" %%b in ('wmic path win32_localtime Get DayOfWeek /value') do set "dow=%%b"
  11. set "day-name=!dn%dow%!" & set month=!mon%MM%!
  12. for /f "tokens=2 delims=^(^)" %%t in ('wmic TimeZone Get Caption /value') do set "zone=%%t"
  13. set "zone=!zone:U=!" & set "zone=!zone:T=!" & set "zone=!zone:C=!" & set "zone=!zone::=!"
  14. echo.Mail Date:
  15. echo.Date: %day-name%, %day% %month% %year% %time-of-day% %zone%
  16. endlocal
  17. pause>nul
  18. EXIT /B 0
复制代码
三、执行结果如下:
  1. Mail Date:
  2. Date: Wed, 23 Feb 2022 12:43:00 +0800
复制代码

TOP

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

TOP

返回列表