【问题标题】:Get the difference between current date and a previous date获取当前日期和上一个日期之间的差异
【发布时间】:2019-04-24 02:10:50
【问题描述】:

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

有什么方法可以在命令提示符下进行这种减法?比如:

set previous_date=Tue 11/20/2018
echo %date% - %previous_date%

我知道用pythonVBScript 这样的编程语言应该很容易做到这一点,但我不想使用其中任何一种,除非绝对必要。我可以下载和使用自定义命令行工具,但我想使用批处理文件来执行此操作。

谁知道怎么做?

【问题讨论】:

  • 有最大天数吗?或者它可以是任何数字?
  • @Aacini 任意号码。即使您没有完整的答案,也只是关于如何完成的想法,请分享。你可能会指出我正确的方向。
  • 当两个日期相隔最多一个月时,比较容易获得差异。否则方法更复杂......我会尽快发布部分答案。
  • @Aacini 谢谢等待
  • @Aacini 既然你参与了,我不妨告诉你我为什么需要这个。我的 Startup 文件夹中有一个 bat 文件,该文件每周运行一次。它通过检查当前日期并在其星期一 if %date:~0,1%==M () 运行进程来实现这一点。问题是我需要这个过程每 7 天启动一次AT LEAST。但是,如果说我忘记在特定的星期一打开我的笔记本电脑,它直到下一个星期一才会启动该过程。所以现在我只想将逻辑更改为launch the process if it hasn't been launched for at least 7 days。不管今天是什么日子。

标签: date batch-file cmd


【解决方案1】:

在你的一个 cmets 中你说:

我的 Startup 文件夹中有一个 bat 文件,该文件运行一次 星期。它通过检查当前日期并运行该过程来做到这一点 如果是星期一如果 %date:~0,1%==M ()。问题是我需要这个过程 至少每 7 天启动一次。但如果说我忘记打开我的 笔记本电脑在特定的星期一,直到它不会启动该过程 下周一。所以现在我只想改变启动的逻辑 至少 7 天未启动的进程

这就是 TaskScheduler 旨在解决的问题。无需搞乱日期计算甚至 %date% 的语言依赖格式。

启动任务调度器
“创建任务”(不要“创建基本任务”)
在“触发器”中设置为“每周”,“每1 周重复一次:Monday
在“设置”中选中“错过预定开始后尽快运行任务”
还可以根据需要填写“常规”、“操作”和“条件”标签。

【讨论】:

  • 感谢您的回答,虽然我使用了 Jack White 的做法,但您的可能也适用。希望它可以帮助其他人将来阅读这个问题。
【解决方案2】:

(我之前已在 cmets 中发布此问题,因为问题已锁定。由于现在已解锁,因此我将其提交为答案)

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

  • 使用其他脚本语言编写,例如 VBS、AutoIt、PowerShell 等。
  • gnuwin32 coreutilsmanualrecipe)下载现有的外部程序,例如 unix date 实用程序。使用fordate "+%%s" 的输出获取到变量中,然后使用set /a 计算差异。
  • 解析内置date 命令或%date% 变量的输出。这在其他地方进行了详细讨论(ABCDE)但请注意,它可能会受到操作系统语言环境时间/日期表示的影响,而且也很难如果您需要精确度,请适当考虑闰年。

我想分享另一个技巧:使用文件创建日期差异。它仍然有点像 hack,但可以说比手动解析 %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 >YOUR_FILENAME

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

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

所以我们会定期尝试复制文件,看看是否成功。为此,我们检查复制的文件 (c:\some\test.txt) 是否存在,如下所示:if exist YOUR_FILENAME goto YOUR_LABEL

最后,如果文件被复制,则不再需要它,我们需要使用del /y YOUR_FILENAME 将其删除。 /y 覆盖确认以防万一,通常可以省略。

如果标记文件因任何原因被删除,示例中的第一行确保该作业(我假设某种备份或类似的东西)立即启动。如果它不存在,文件将永远不会被复制,因为原始文件本来就不存在,所以作业永远不会在这种情况下运行。

怪癖:

如果某些程序出于某种原因更新了“标记”文件的修改日期,则该作业将被延迟。如果不希望这样做,您应该将此文件放在遥不可及的地方,例如%AppData%\Roaming\YOUR_SCRIPT_NAME 文件夹。如果文件从备份中恢复,同样的事情也可能发生。

要解决此类问题,您可以考虑将标记文件压缩到存档中,例如 zip,但这也需要外部程序、VBS 或 PowerShell。可能会以某种方式滥用内置的 Windows 备份实用程序 (sdclt),但我还没有找到方法。

【讨论】:

  • 感谢您提供详细信息。多亏了你,当我在 stackoverflow 上发布我的问题时,我得到了我想要的东西。档案时代!如此简单,却是天才。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-22
  • 2020-06-05
  • 1970-01-01
  • 1970-01-01
  • 2018-10-29
相关资源
最近更新 更多