如何将字符串时间戳转换为 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
我遇到这个问题已经有一段时间了,但我找不到解决它的好方法。所以我有一个这样的时间戳,例如: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