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

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

在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下比较固定。

(0)

相关推荐

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

    谈到日期字符串的输出,真是让人烦. 在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:

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

    在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%%d

  • JS截取字符串的三种方法详解

    JS提供三个截取字符串的方法,分别是:slice(),substring()和substr(),它们都可以接受一个或两个参数: var stmp = "rcinn.cn"; 使用一个参数 alert(stmp.slice(3));//从第4个字符开始,截取到最后个字符;返回"nn.cn" alert(stmp.substring(3));//从第4个字符开始,截取到最后个字符;返回"nn.cn" 使用两个参数 alert(stmp.slice(1

  • C语言实现短字符串压缩的三种方法详解

    目录 前言 一.通用算法的短字符压缩 二.短字符串压缩 (1)Smaz (2)Shoco (3)Unisox2 三.总结 前言 上一篇探索了LZ4的压缩和解压性能,以及对LZ4和ZSTD的压缩.解压性能进行了横向对比.文末的最后也给了一个彩蛋:任意长度的字符串都可以被ZSTD.LZ4之类的压缩算压缩得很好吗? 本篇我们就来一探究竟. 一.通用算法的短字符压缩 开门见山,我们使用一段比较短的文本:Narrator: It is raining today. So, Peppa and George

  • Java多线程下解决资源竞争的7种方法详解

    前言 一般情况下,只要涉及到多线程编程,程序的复杂性就会显著上升,性能显著下降,BUG出现的概率大大提升. 多线程编程本意是将一段程序并行运行,提升数据处理能力,但是由于大部分情况下都涉及到共有资源的竞争,所以修改资源 对象时必须加锁处理.但是锁的实现有很多种方法,下面就来一起了解一下在C#语言中几种锁的实现与其性能表现. 一.c#下的几种锁的运用方式 1.临界区,通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问. private static object obj = n

  • Springboot配置返回日期格式化五种方法详解

    目录 格式化全局时间字段 1.前端时间格式化(不做无情人) 2.SimpleDateFormat格式化(不推荐) 3.DateTimeFormatter格式化(不推荐) 4.全局时间格式化(推荐) 实现原理分析 5.部分时间格式化(推荐) 总结 应急就这样 格式化全局时间字段 在yml中添加如下配置: spring.jackson.date-format=yyyy-MM-dd HH:mm:ss 或者 spring: jackson: ## 格式为yyyy-MM-dd HH:mm:ss date-

  • Python格式化输出字符串的五种方法总结

    目录 1. 引言 2. 函数 center() 3. 函数 ljust() 4. 函数 rjust() 5. 函数 zfill() 6. 函数 title() 7. 使用 1. 引言 Python语言有许多优点,常用于不同的领域,如数据科学.web开发.自动化运维等.开发人员在这些技术中选择Python的一个重要原因是Python语法简单,可以节省大家的开发时间. 在本文中,我们将学习如何使用字符串中内置的方法来格式化字符串.闲话少说,我们直接开始吧! 2. 函数 center() 函数cent

  • 解析Json字符串的三种方法日常常用

    在很多时候,我们的需要将类似 json 格式的字符串数据转为json, 下面将介绍日常中使用的三种解析json字符串的方法 1.首先,我们先看一下什么是 json 格式字符串数据,很简单,就是 json 字符串化,在json 最外加单/双号变为字符串数据    var str='{"name":"Mike","sex":"女","age":"29"}'; var t2="[{n

  • Python3日期与时间戳转换的几种方法详解

    日期和时间的相互转换可以利用Python内置模块 time 和 datetime 完成,且有多种方法供我们选择,当然转换时我们可以直接利用当前时间或指定的字符串格式的时间格式. 获取当前时间转换 我们可以利用内置模块 datetime 获取当前时间,然后将其转换为对应的时间戳. import datetime import time # 获取当前时间 dtime = datetime.datetime.now() un_time = time.mktime(dtime.timetuple())

  • Python比较两个日期的两种方法详解

    目录 datetime strptime 之前我们曾经分享过:Python获取某一日期是“星期几”的6种方法!实际上,在我们使用Python处理日期/时间的时候,经常会遇到各种各样的问题.今天我们就来探讨另一个问题,如何用Python比较两个日期? datetime 如果需要用Python处理日期和时间,大家肯定会先想到datetime.time.calendar等模块.在这其中,datetime模块主要是用来表示日期时间的,就是我们常说的年月日/时分秒. datetime模块中常用的类: 类名

随机推荐