注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天涯倦客的博客

祝福你朋友永远快乐!

 
 
 

日志

 
 

再谈DOS批处理下格式化日期字符串的三种方法(详解)  

2018-02-28 14:28:11|  分类: 电脑 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

谈到日期字符串的输出,真是让人烦。

在Linux下,简单的一句话:date '+%Y%m%d-%H%M%S'就可以得到你要的输出:20120331-064219 
可是在windows下,要想得到这个,还是需要费点功夫的。

1. 直接用字符串格式化输出

比如,如果你的机器上时间的输出是这样子的: 
c:\>echo %date%-%time% 
2012-03-31 星期六- 6:44:02.50 
那么,要想得到输出20120331- 64402,可以这样截取字符串: 
c:\>echo %date:~0,4%%date:~5,2%%date:~8,2%-%time:~0,2%%time:~3,2%%time:~6,2% 
20120331- 65406 
表示取从0位置开始4个字符等等。这个方法不能截断空格。比较恼火

2.用for语句分断截取,似乎好点

先看看for的用法:


FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]

optinos 
eol=c           - 指一个行注释字符的结尾(就一个)//要忽略以什么字符开头的行 
skip=n          - 指在文件开始时忽略的行数。 
delims=xxx      - 指分隔符集。这个替换了空格和跳格键的//指定分割的字符列入delims=;:.使用了";",":","."做分隔 
                  默认分隔符集。 
tokens=x,y,m-n  - 指每行的哪一个符号被传递到每个迭代 
                  的 for 本身。这会导致额外变量名称的分配。m-n 
                  格式为一个范围。通过 nth 符号指定 mth。如果 
                  符号字符串中的最后一个字符星号, 
                  那么额外的变量将在最后一个符号解析之后 
                  分配并接受行的保留文本。 
usebackq        - 指定新语法已在下类情况中使用: 
                  在作为命令执行一个后引号的字符串并且一个单 
                  引号字符为文字字符串命令并允许在 filenameset 
                  中使用双引号扩起文件名称。 
参照这个用法,我们可以对日期字符串进行格式化输出: 
因为日期结果是:2012-03-31 星期六 
因为分隔字符是'-'还有空格' ',所以取3段出来,如: 
c:\>for /f "tokens=1-3 delims=- " %1 in ("%date%") do @echo %1%2%3 
20120331 
再看时间: 
c:\>echo %time% 
6:59:20.38 
c:\>for /f "tokens=1-3 delims=.: " %1 in ("%time%") do @echo %1%2%3 
65939 
两者一结合起来可以这样用:


c:\>for /f "tokens=1-3 delims=- " %1 in ("%date%") do set ttt=%1%2%3 
c:\>set ttt=20120331 
c:\>for /f "tokens=1-3 delims=.: " %1 in ("%time%") do set ttt=%ttt%-%1%2%3 
c:\>set ttt=20120331-70131

写成批处理,就变成这样(goodtime.bat):


for /f "tokens=1-3 delims=- " %%1 in ("%date%") do set ttt=%%1%%2%%3
for /f "tokens=1-3 delims=.: " %%1 in ("%time%") do set ttt=%ttt%-%%1%%2%%3

echo goodtime=%ttt% 
这种方法比较灵活。

3.还有一种,是使用VBScript来定制输出


wscript.echo   year(date)   &   right( "0"   &   month(date),2)   &   right( "0"   &   day(date),2)   &   "-" & right( "0"   &   hour(time),2)   &   right( "0"   &   minute(time),2) 

结果如下,还是比较有意思的


c:\>cscript /nologo c:\shared\datescript.vbs
20120331-0711
当然这样还是不太理想,可以写个批处理,把结果弄到环境变量当中:
mydate2.bat,内容如下:
@echo off
cscript /nologo datescript.vbs >> tmp.txt
for /f "tokens=*" %%1 in (tmp.txt) do set goodtime=%%1
echo goodtime=%goodtime%

总结起来,第3种方法最复杂,目前还不能断定是否在所有windows平台都能正确运行,但是结果应该是固定的。不随着date,time格式变动而变动。但是1和2会依赖于日期时间的格式。仅此而已。 
还是linux下比较固定。

  评论这张
 
阅读(97)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018