Date 获取当前日期和上一日期之间的差异

Date 获取当前日期和上一日期之间的差异,date,batch-file,cmd,Date,Batch File,Cmd,如果我在cmd中输入echo%date%,我将得到今天的日期。假设今天是2018年11月21日星期三。如果我键入echo%date%cmd将打印2018年11月21日星期三。昨天,它将于2018年11月20日星期二返回。这两个日期之间的差异(以天为单位)为1 有没有办法在命令提示符下执行这种减法?比如: set previous_date=Tue 11/20/2018 echo %date% - %previous_date% 我知道这在像python或VBScript这样的编程语言中应该很容

如果我在cmd中输入
echo%date%
,我将得到今天的日期。假设今天是2018年11月21日星期三。如果我键入
echo%date%
cmd将打印
2018年11月21日星期三
。昨天,它将于2018年11月20日星期二返回。这两个日期之间的差异(以天为单位)为
1

有没有办法在命令提示符下执行这种减法?比如:

set previous_date=Tue 11/20/2018
echo %date% - %previous_date%
我知道这在像
python
VBScript
这样的编程语言中应该很容易做到,但我不想使用任何一种,除非这是绝对必要的。我可以下载并使用自定义命令行工具,但我想用批处理文件来实现这一点

任何知道怎么做的人?

(我之前在评论中发布过这一点,因为问题被锁定。由于它现在被解锁,我将此作为答案提交)

批处理脚本语言没有任何内置的计算时间差的方法。这个问题可以通过各种方式解决,例如:

  • 使用其他脚本语言编写,如VBS、AutoIt、PowerShell等
  • 从(,)下载现有的外部程序,如unix
    date
    实用程序。使用
    for
    日期“+%s”
    的输出获取到变量中,然后使用
    设置/a
    计算差值
  • 分析内置
    date
    命令或
    %date%
    变量的输出。其他地方(,)对此进行了详细讨论,但请注意,它可能会受到操作系统区域设置时间/日期表示的影响,如果需要精度,也很难正确考虑闰年
我想分享另一个技巧:使用文件创建日期差异。这仍然有点像黑客,但可以说比手工解析
%date%
更具可移植性

下面是一个示例,解释如下:

if not exist "c:\some\marker.txt" goto RunTheJob
robocopy /minage:7 "c:\some\marker.txt" "c:\some\test.txt"
if exist "c:\some\test.txt" goto RunTheJob
goto SkipTheJob

:RunTheJob
del /y "c:\some\test.txt"
echo 1 >"c:\some\marker.txt"
rem ... THIS RUNS ONCE IN 7 DAYS ...

:SkipTheJob
无论何时运行作业(即7天一次),我们都会创建(或更新)一个“标记”文件(
c:\some\marker.txt
)。这个文件的内容和位置不重要,只有修改日期才重要,所以我只需将字符
1
echo 1>您的文件名

这也巧妙地解决了在某处存储日期信息的问题

现在,要测试自上次运行作业以来是否至少已经过了7天,您需要检查文件是否至少有7天。最简单的方法是使用
robocopy
实用程序-其
/minage:NNN
参数仅在文件至少存在NNN天时复制文件

因此,我们定期尝试复制该文件,看看是否成功。我们通过检查复制的文件(
c:\some\test.txt
)是否像这样存在:
如果存在您的文件名转到您的\u标签

最后,如果文件已被复制,则不再需要该文件,我们需要使用
del/y删除您的\u文件名
<代码>/y
仅为以防万一而覆盖确认,通常可以省略

如果由于任何原因删除了标记文件,示例中的第一行将确保立即启动作业(我假设是某种备份或类似的操作)。如果文件不存在,则永远不会复制该文件,因为原始文件首先不存在,因此在这种情况下作业永远不会运行

怪癖:

如果某些程序出于某种原因更新“标记”文件的修改日期,则作业将被延迟。如果这是不需要的,您应该将此文件放在够不着的地方,例如
%AppData%\Roaming\YOUR\u SCRIPT\u NAME
文件夹。如果从备份中还原文件,也可能发生同样的情况

为了解决这样一个问题,你可以考虑将标记文件压缩成一个存档文件,如<代码> zip ,但这也需要外部程序、VBS或POWER S壳。可能会以某种方式滥用内置的Windows备份实用程序(

sdclt
),但我没有找到解决方法。

(我以前在评论中发布过此问题,因为问题已锁定。由于问题已解锁,我将此作为答案提交)

批处理脚本语言没有任何内置的计算时间差的方法。这个问题可以通过各种方式解决,例如:

  • 使用其他脚本语言编写,如VBS、AutoIt、PowerShell等
  • 从(,)下载现有的外部程序,如unix
    date
    实用程序。使用
    for
    日期“+%s”
    的输出获取到变量中,然后使用
    设置/a
    计算差值
  • 分析内置
    date
    命令或
    %date%
    变量的输出。其他地方(,)对此进行了详细讨论,但请注意,它可能会受到操作系统区域设置时间/日期表示的影响,如果需要精度,也很难正确考虑闰年
我想分享另一个技巧:使用文件创建日期差异。这仍然有点像黑客,但可以说比手工解析
%date%
更具可移植性

下面是一个示例,解释如下:

if not exist "c:\some\marker.txt" goto RunTheJob
robocopy /minage:7 "c:\some\marker.txt" "c:\some\test.txt"
if exist "c:\some\test.txt" goto RunTheJob
goto SkipTheJob

:RunTheJob
del /y "c:\some\test.txt"
echo 1 >"c:\some\marker.txt"
rem ... THIS RUNS ONCE IN 7 DAYS ...

:SkipTheJob
无论何时运行作业(即7天一次),我们都会创建(或更新)一个“标记”文件(
c:\some\marker.txt
)。这个文件的内容和位置不重要,只有修改日期才重要,所以我只需将字符
1
echo 1>您的文件名

这也巧妙地解决了在某处存储日期信息的问题

现在,要测试自上次运行作业以来是否至少已经过了7天,您需要检查文件是否至少有7天。最简单的方法是使用
robocopy
实用程序-其
/minage:NNN
参数仅在文件至少存在NNN天时复制文件

因此,我们定期尝试复制该文件,看看是否成功。我们通过检查copi