将数字转换为时间戳(在特定位置插入冒号)

Converting numbers into timestamps (inserting colons at specific places)

我为此使用 AutoHotkey,因为代码对我来说是最容易理解的。所以我有一个包含数字和文本的文档,例如这样

120344 文字文字文字

234000 文字文字

所需的输出是

12:03:44 文字文字文字

23:40:00文字文字

我确定可以使用 StrReplace 插入冒号,但我不确定如何指定冒号的位置或询问 AHK 'find' 特定的 6 位数字字符串。以前,我会突出显示要应用 StrReplace 的文本,然后按热键,但我想知道是否有更有效的方法不需要我的交互来执行此操作。即使只是指出我需要研究的相关功能也会有所帮助!非常感谢,我对编程还是很陌生。

假设“时间戳”组件始终为 6 个字符长并且始终位于字符串的开头,此解决方案应该可以正常工作。

    String test = "012345 test test test";
    test = test.substring(0, 2) + ":" + test.substring(2, 4) + ":" + test.substring(4, test.length());

这输出 01:23:45 test test test

为什么?因为您临时创建了一个 String 对象,它有两个字符长,然后在获取下一对之前插入冒号。最后,您附加 String 的其余部分并将其分配给您想要的任何 String 变量。请记住,substring 方法不会修改您调用该方法的 String 对象。此方法 returns 一个“新” String 对象。因此,变量 test 直到赋值操作结束时才被修改。

或者,您可以使用 StringBuilder 并像这样附加每个组件:

StringBuilder sbuff = new StringBuilder();
sbuff.append(test.substring(0,2));
sbuff.append(":");
sbuff.append(test.substring(2,4));
sbuff.append(":");
sbuff.append(test.substring(4,test.length()));
test = sbuff.toString();

您也可以使用“花哨的”循环来执行此操作,但我认为对于这种简单的事情,循环只是矫枉过正。哦,我差点忘了,这应该适用于你的两个测试字符串,因为在最后一个冒号插入之后,代码会不加区别地从索引位置 4 一直到字符串末尾获取子字符串。

hfontanez 的回答对解决这个问题很有帮助,我不得不使用循环和子字符串函数。我确信编写这段代码的方式要简单得多,但这是适合我的目的的最终版本:

Loop, read, C:\[location of input file]
{
  { If A_LoopReadLine = ;
   Continue ; this part is to ignore the blank lines in the file
  }
  { 
    one := A_LoopReadLine
    x := SubStr(one, 1, 2)
    y := SubStr(one, 3, 2)
    z := SubStr(one, 5)
    two := x . ":" . y . ":" . z
    FileAppend, %two%`r`n, C:\[location of output file]
   }
}
return