当前位置: 首页 > 知识库问答 >
问题:

午夜后时间设置不正确

翟青青
2023-03-14

我使用以下内容以更可读的格式获取当前日期/时间:

set day=%date:~4,2%
set mth=%date:~7,2%
set yr=%date:~10,4%
set hur=%time:~0,2%
set min=%time:~3,2%
set bdate=[%day%-%mth%-%yr%]-[%hur%-%min%]

这很好地工作,并输出如下内容:<代码>[02-06-2020]-[22-59]

但是,午夜之后,时间格式从HH:MM:SS:MS更改为H:MM:SS:MS。这会弄乱格式,因为它在时间中包含冒号,因为字符被移了一位。这会导致在午夜之后创建的日志文件中出现无用的日期/时间信息。

有没有什么方法可以让时间总是以两位数的格式表示?

共有3个答案

虞修平
2023-03-14
匿名用户

set "day=%date:~4,2%"
set "mth=%date:~7,2%"
set "yr=%date:~10,4%"
set "_time=0%time%"
set "hur=%_time:~-11,2%"
set "min=%_time:~-8,2%"
set bdate=[%day%-%mth%-%yr%]-[%hur%-%min%]

您可以用一个0填充时间,然后用负数作为字符串的起始位置从右侧进行替换<代码>1:00将变为01-00,以匹配HH-MM的模式。

澹台华晖
2023-03-14

最好的建议是使用其他方法检索信息,例如:

@For /F "Tokens=1-5Delims=/: " %%G In (
    '""%__AppDir__%Robocopy.exe" \: . /NJH /L|"%__AppDir__%find.exe" " 123""'
)Do @Set "bdate=[%%I-%%H-%%G]-[%%J-%%K]"

该方法涉及从内置的机器人复制实用程序生成错误消息。我们通过要求它从当前驱动器根目录中名为的目标目录复制来做到这一点,\。返回错误,因为Windows不允许包含字符的目录名。无论语言环境、PC或用户如何,该错误消息始终以已知格式输出以日期和时间字符串开头的行,yyy/MM/dd hh: mm: ss

例子:

2020/02/08 01:25:04 ERROR 123 (0x0000007B) Accessing Source Directory C:\:\
The filename, directory name, or volume label syntax is incorrect.
2020/02/08 01:25:04 ОШИБКА 123 (0x0000007B) Доступ к исходной папке C:\:\
‘Ё*в*ЄбЁзҐбЄ*п ®иЁЎЄ* ў Ё¬Ґ*Ё д*©«*, Ё¬Ґ*Ё Ї*ЇЄЁ Ё«Ё ¬ҐвЄҐ ⮬*.
2020/02/08 01:25:04 ERREUR 123 (0x0000007B) Copie du fichier C:\:\
La syntaxe du nom de fichier, de répertoire ou de volume est incorrecte.
2020/02/08 01:25:04 FEHLER 123 (0x0000007B) Zugriff auf Zielverzeichnis C:\:\
Die Syntax für den Dateinamen, Verzeichnisnamen oder die Datenträgerbezeichnungist falsch.

我们在for循环中运行RoboCope命令,以便我们可以根据已知的行位置、格式和分隔符捕获所需的字符串。我们还需要考虑输出由多行组成的事实。要选择该行,我使用了内置的查找实用程序,并选择仅匹配包含字符串的行

    ↓  ↓  ↓  ↓  ↓    delims
2020/02/08 01:25:04
↑    ↑  ↑  ↑  ↑
 1    2  3  4  5     tokens
 %G  %H %I %J %K

要获取有关如何使用for循环的更多信息,请打开命令提示窗口并输入for/

宦翔飞
2023-03-14

日期可以在开始处不带或带缩写的工作日,也可以在缩写的工作日后不带或带逗号。日期字符串的格式可以是年/月/日或月/日/年或日/月/年,并带有<代码>/<代码>或<代码> 或<代码>或<代码>

时间可以是12小时或24小时格式。小时数可以是无前导的,也可以是小于10的。

看起来可以使用以下代码和作为时间字符串中的分隔符:

if "%TIME:~1,1%" == ":" (
    set "bdate=[%DATE:~-10,2%-%DATE:~-7,2%-%DATE:~-4%]-[0%TIME:~0,1%-%TIME:~2,2%]"
) else (
    set "bdate=[%DATE:~-10,2%-%DATE:~-7,2%-%DATE:~-4%]-[%TIME:~0,2%-%TIME:~3,2%]"
)

如果时间字符串中的第二个字符是冒号,则条件为true,并且第一个表达式与左至一位数的小时一起使用,否则ELSE块与两位数的小时一起使用。

时间字符串中分隔符为冒号、点或空格的另一种解决方案是:

for /F "tokens=1,2 delims=:. " %%I in ("%TIME%") do set "Hour=0%%I" & set "Minute=%%J"
set "bdate=[%DATE:~-10,2%-%DATE:~-7,2%-%DATE:~-4%]-[%Hour:~-2%-%Minute%]"

剩下的小时数:或 或<代码>

更好的方法是使当前日期和时间区域(国家)独立,并使用字符串替换将其重新格式化为所需的格式。

可以使用Windows Management Instrumentation命令行工具WMIC获取与区域无关的日期/时间字符串。

命令行

wmic OS GET LocalDateTime /VALUE

输出UTF-16 Little Endian编码,例如:



LocalDateTime=20200208124514.468000+060


有两行空行,然后是格式为yyyyMMddHHmmss的当前本地日期/时间行。微秒±UTC偏移(分钟)和另外两条空行。

数据可以与以下批处理代码一起使用:

@echo off
for /F "tokens=2 delims==." %%I in ('%SystemRoot%\System32\wbem\wmic.exe OS GET LocalDateTime /VALUE') do set "DateTime=%%I"
set "bdate=[%DateTime:~6,2%-%DateTime:~4,2%-%DateTime:~0,4%]-[%DateTime:~8,2%-%DateTime:~10,2%]"

这里感兴趣的只是等号和小数点之间的日期/时间字符串,这是使用为 /F选项标记=2分隔符==的原因。只是20200208124514分配给循环变量I,其值分配给环境变量DateTime旁边。

使用字符串替换重新格式化环境变量DateTime,以获取日期/时间字符串

当然,可以在任何地方使用bdate而不是DateTime,只使用一个环境变量而不是两个变量。

使用WMIC获取本地日期/时间的优点是它独立于Windows区域设置,甚至可以在Windows XP上工作。缺点是,与在几微秒内访问的Windows命令处理器的日期和时间动态变量相比,命令执行需要相当长的时间(在Windows XP上为1到2秒,在Windows Vista和更新的Windows版本上为50多毫秒)。

的命令在正确解析UTF-16 LE编码的Unicode输出时遇到问题。它将WMIC输出的字节序列(回车换行)解释为错误的,即两个回车和一个换行。这导致将WMIC输出末尾的最后两个空行解释为两行,其中一个回车为字符串。

这通常是一个问题,因为set“EnvironmentVariable=%%I”的结果是with展开以仅回车返回之前已定义的环境变量的删除

有多种解决方案可以解决FOR命令的Unicode解析错误。可以附加

另一种解决方案是使用如果未定义DateTime set“DateTime=%%I”set

另一个解决方案是此代码中使用的解决方案。属性的名称及其值输出在

请参阅如何在解析输出时纠正变量覆盖错误行为?cmd正在以某种方式将中文文本写入输出,以了解有关UTF-16 Little Endian编码输出上FOR解析问题的详细信息。

另一个独立于当前日期和时间区域的解决方案是使用ROBOCOPY,该解决方案自Windows Vista和Windows Server 2003在Windows的系统目录中提供以来,就一直可用,但通过

ROBOCOPY是使用无效的源目录字符串“C:\\;”和有效的目标目录字符串执行的(也可以是其他有效的)和参数NJH来抑制标题信息的输出。

robocopy "C:\|" . /NJH

此执行将生成错误消息:


2020/02/08 12:45:14 ERROR 123 (0x0000007B) Accessing Source Directory C:\|\
The filename, directory name, or volume label syntax is incorrect.

空行后第二行开头的当前日期/时间格式与区域无关。

此输出可通过以下方式处理:

set "bdate="
for /F "tokens=1-5 delims=/: " %%G in ('%SystemRoot%\System32\robocopy.exe "%SystemDrive%\|" . /NJH') do if not defined bdate set "bdate=[%%I-%%H-%%G]-[%%J-%%K]"

对于本例中的启动,在后台再执行一个命令进程,其中包含%ComSpec%/c,并将两个命令行之间的命令行作为附加参数附加,从而导致Windows

C:\Windows\System32\cmd.exe /c C:\Windows\System32\robocopy.exe "C:\|" . /NJH

用于处理FOR捕获的后台命令进程的STDOUT的错误消息输出的第一个非空行的前五个斜杠或冒号或空格分隔的字符串是

  • G。。。年份

这五个数据字符串以所需的格式连接到日期/时间字符串。

但是FOR将再次为第二个错误消息行运行命令集。因此,在运行之前,环境变量bdate显式未定义。环境变量bdate首先用日期/时间字符串定义,然后不再修改,以处理第二个非空行,因为附加的IF条件可避免覆盖的日期/时间字符串

与WMIC解决方案相比,ROBOCOPY解决方案的优势在于其执行速度更快。

要了解使用的命令及其工作方式,请打开命令提示窗口,在那里执行以下命令,并仔细阅读为每个命令显示的所有帮助页。

  • <代码>回声/
  • <代码>用于/
  • <代码>如果/
  • <代码>机器人复制/
  • <代码>设置/
  • <代码>wmic/
  • wmic操作系统
  • wmic os get/
  • wmic os获取localdatetime/

PS:有很多其他解决方案可以以特定格式获取当前日期/时间,独立于为已用帐户配置的国家/地区。所有这些替代解决方案都可以在以下答案中找到:

如何在Windows命令行上以合适的格式获取当前日期/时间,以便在文件/文件夹名称中使用?

 类似资料:
  • 问题内容: 我正在努力计算午夜后的时间: 问题答案: 如果您不关心夏令时的变化,并且假设世界是理想的(不是理想的),则可以从24小时中减去结束与开始之间的持续时间(以开始与结束为间隔):

  • 问题内容: 我有一个对象,我想将它设置为任意时间(比如半夜),这样我可以使用的功能一致,而不用担心时间来检索数据 时 创建的对象。 我尝试使用和通过一些Objective-C方法修改其组件,如下所示: 上述方法的问题在于,您只能设置一个时间单位(),因此您只能精确地选择以下其中一项: 天 月 年 小时 分钟 秒 有没有办法同时设置小时,分钟和秒并保留日期(日/月/年)? 问题答案: 您的声明 上述

  • 问题内容: 我正在创建一个Android小部件,希望在每晚的午夜更新。我正在使用,我需要找出从当前时间到午夜还剩下多少毫秒。这是我的代码: 如何计算到午夜还有几毫秒? 先感谢您。 问题答案: 使用日历来计算它:

  • 问题内容: 我试图让我对datetime模块有所了解。我知道现在是一个纪元,一个事件的最后发生时间(一个纪元)。我需要做的是弄清楚该事件是否在昨天的午夜和午夜之间发生。 24小时前的电话是-86400,但我如何将其四舍五入到午夜。我真的很难找到一种方法来获取和获取日期时间的时间戳,或者然后操纵日期时间来设置时间。 问题答案: 在半夜 生成最后一个午夜很容易: 结合了今天的日期(您可以使用,也可以选

  • 问题内容: 我需要创建两个日期对象。如果当前日期和时间是2012年3月9日上午11:30,则 日期对象d1应该是 2012年3月9日上午12:00 日期对象d2应该包含当前日期本身 日期不会输入,它是系统日期。 更新 : 给出当前日期和时间 问题答案: 应该是IST 2012年3月9日00:00:00

  • 问题内容: 首先,这是我在Java 1类中遇到的一个简单问题。这是一个静态时间,我已经将其设置为“今天”为8:49:12,因此我要弄清楚这代表了午夜之后的多秒,以及“午夜”之后的秒数。8小时49分钟12秒。现在是我的代码: 我的问题是,我如何获得的时候不知道 从 和 自 午夜。 因此,基本上输出是: 之后的空间是几秒钟。 谢谢,请解释原因,以及如何选择解决方法。我想学习:P 问题答案: 试试这个简