如何将字符串时间戳转换为 Lua(或其他语言)中的数组

How to convert a string timestamp into an array in Lua (or other languages)

我遇到这个问题已经有一段时间了,但我找不到解决它的好方法。所以我有一个这样的时间戳,例如:local t = "00:00:0.031",我试图将它转换成这样的数组:

local ft = {
    hours = 0,
    minutes = 0,
    seconds = 0,
    milliseconds = 31
}

无论使用哪种语言,这几乎都是一样的,所以如果您知道如何解决这个问题但不知道 Lua,您可以使用任何语言提交您的答案。我尝试使用正则表达式自己解决它,我很确定这种方式是可能的...

感谢您对我的问题的关注,祝您愉快(:

我最简单的答案就是用正则表达式拆分给定的字符串,在本例中为 HOUR:MIN:SEC.MS 首先按 (:) 拆分以获得 HOUR MIN & SEC+MS,然后按 (.) 拆分 SEC+MS 以分隔秒和毫秒

以下是我在java

中的回答
import java.util.*;

class timeX {
    long hours = 0,
    minutes = 0,
    seconds = 0,
    milliseconds = 31;
    
    //Convert Given Time String To Vars
    timeX(String input) {
        //Split Input By (:) For Hour, Minutes & Seconds+Miliseconds
        String[] splitted=input.split(":");
        this.hours=Long.parseLong(splitted[0]);
        this.minutes=Long.parseLong(splitted[1]);
        
        //Split Again For Seconds And Miliseconds By (.)
        String[] splittedMandS=splitted[2].split("\.");
        this.seconds=Long.parseLong(splittedMandS[0]);
        this.milliseconds=Long.parseLong(splittedMandS[1]);
    }
}

public class Main
{
    public static void main(String[] args)
    {
        timeX tmp = new timeX("30:20:2.031");
        System.out.println("H: "+tmp.hours+" M: "+tmp.minutes+" S: "+tmp.seconds+" MS: "+tmp.milliseconds);
    }
}

这是使用 string.gmatch 的一个不错的方法,它在 Lua 中由正则表达式拆分。这里的值被 ":""." 分割。然后有一个计数器来匹配结果 table.

的索引
local t = "00:00:0.031"

local ft = {
  hours = 0,
  minutes = 0,
  seconds = 0,
  milliseconds = 0
}
local count = 1
for str in string.gmatch(t, "([^:|.]+)") do
  ft[count] = tonumber(str)
  count = count + 1
end

你可以在之后做一个打印循环来检查结果

for i = 1, 4 do
  print(ft[i])
end

输出:

0
0
0
31

我在解决方案中发现的主要问题是它不保存所列键下的值,而是保存数字 1 2 3 4。

您可以使用 string.match 首先提取子字符串。第二次,您可以使用函数 tonumber 将其转换为数字。

function ParseTimestampString (TimestampString)
  local Hours, Minutes, Seconds, Milliseconds = string.match(TimestampString, "(%d+)%:(%d+)%:(%d+)%.(%d+)")
  local Result
  
  if Hours and Minutes and Seconds and Milliseconds then
    Result = {
      hours        = tonumber(Hours),
      minutes      = tonumber(Minutes),
      seconds      = tonumber(Seconds),
      milliseconds = tonumber(Milliseconds)
    }
  end

  return Result
end

使用下面的代码,你可以得到你想要的结果:

Result = ParseTimestampString("00:00:0.031")

print(Result.hours)
print(Result.minutes)
print(Result.seconds)
print(Result.milliseconds)

这应该returns:

> Result = ParseTimestampString("00:00:0.031")
>
> print(Result.hours)
0
> print(Result.minutes)
0
> print(Result.seconds)
0
> print(Result.milliseconds)
31

有了 Lua 你可以做...

os.date()可以秒格式化工具
...但取决于操作系统。
这适用于 Linux 但不适用于 MS-Windows.

(据我所知)
print(os.date('%H:%M:%S',0-3600)) -- puts out: 00:00:00
print(os.date('%H:%M:%S',300-3600)) -- puts out: 00:05:00

它也可以将 date/time 输出为 table。

> tshow=function(tab) for k,v in pairs(tab) do print(k,'=',v) end end
> tshow(os.date('*t'))
day =   4
year    =   2021
month   =   11
hour    =   11
yday    =   308
isdst   =   false
min =   23
wday    =   5
sec =   51

...不幸的是它没有毫秒。

如果 os.date() 的 table 输出保存为 table...

> ttable=os.date('*t')
> os.time(ttable)
1636021672
> os.date(_,os.time(ttable))
Thu Nov  4 11:27:52 2021
> os.date('%H:%M:%S',os.time(ttable))
11:27:52

...那么它的 key/value 对可用于:os.time()

ttable 键 1 是你用毫秒作为字符串的时间时,进一步的代码几乎可以满足你的期望...

local tshow=function(tab) for k,v in pairs(tab) do print(k,'=',v) end end
local ttable=os.date('*t') -- Create a time table
ttable[1]='0:0:0.31' -- Numbered keys in sequence are ignored by os.tim()
ttable[2]=ttable[1]:gsub('(%d+):(%d+):(%d+)[.](%d+)','return {year=ttable.year,month=ttable.month,day=ttable.day,hour=%1,min=%2,sec=%3,milliseconds=%4}')
-- That creates ttable[2] with the value:
--- return {year=ttable.year,month=ttable.month,day=ttable.day,hour=0,min=0,sec=0,milliseconds=31}
-- Lets convert it now to a table with...
ttable[2]=load(ttable[2])()
-- Using tshow() to look inside
tshow(ttable[2])

那将输出...

milliseconds    =   31
day =   4
year    =   2021
hour    =   0
month   =   11
min =   0
sec =   0

这会将其格式化为 os.date()

print(os.date('%H:%M:%S.'..ttable[2].milliseconds,os.time(ttable[2])))
-- Output: 00:00:00.31