将秒表“hh:mm:ss:ms”转换为存储在数据库中
Posted
技术标签:
【中文标题】将秒表“hh:mm:ss:ms”转换为存储在数据库中【英文标题】:Convert stopwatch "hh:mm:ss:ms" to store in database 【发布时间】:2020-10-17 11:23:02 【问题描述】:我正在尝试在我的数据库中保存可变长度的时间。最长的可能包括几个小时,较短的只有几分钟。较短的字符串只会读取“mm:ss.ms”或“:ss.ms”,因此总长度会更短。
我试过DateTime
,但它需要年、月和日。我尝试将日期设置为 0000-00-00,但没有成功。
我尝试对所有内容进行硬编码,但希望有更优雅的解决方案。这是我走了多远:
// for shorter string of type ":mm.ms"
if (myString.length >= 3) AND (myString.length <= 4)
if (myString.contains(':'))
myString.substring(1); //remove initial semicolon
int _seconds = int.parse(myString.substring(0,1));
int _milliseconds = int.parse(myString.substring(3,3));
任何指针将不胜感激。
【问题讨论】:
使用Duration
。
【参考方案1】:
如果我解决了您的问题,这可能是您的解决方案:
String test = ":23.24";
String minutes = test.split(":")[0];
String seconds = test.split(":")[1].split(".")[0];
String milliseconds = test.split(":")[1].split(".")[1];
Duration duration = Duration(
minutes: int.tryParse(minutes) ?? 0,
seconds: int.tryParse(seconds) ?? 0,
milliseconds: int.tryParse(milliseconds) ?? 0);
print(duration.inMilliseconds);
编辑:我找到了另一种方式,它也允许几个小时并且更强大:
int parseTimeString(String string, int currentLayer = 0)
if ((string?.length ?? 0) == 0) return 0;
String splitString = currentLayer == 0 ? "." : ":";
int parsed =
int.tryParse(string.substring(string.lastIndexOf(splitString) + 1)) ?? 0;
Duration duration;
switch (currentLayer)
case 0:
duration = Duration(milliseconds: parsed);
break;
case 1:
duration = Duration(seconds: parsed);
break;
case 2:
duration = Duration(minutes: parsed);
break;
case 3:
duration = Duration(hours: parsed);
break;
return duration.inMilliseconds +
parseTimeString(
string.substring(
0,
string.lastIndexOf(splitString) == -1
? 0
: string.lastIndexOf(splitString)),
currentLayer: currentLayer + 1);
Edit2:我认为这应该适合你。
int parseTimeString(String string, int currentLayer = 0)
if ((string?.length ?? 0) == 0) return 0;
String splitString = currentLayer == 0 ? "." : ":";
String substring = string.substring(string.lastIndexOf(splitString) + 1);
if(currentLayer == 0)
while(substring.length<3)
substring += "0";
int parsed =
int.tryParse(substring) ?? 0;
Duration duration;
switch (currentLayer)
case 0:
duration = Duration(milliseconds: parsed);
break;
case 1:
duration = Duration(seconds: parsed);
break;
case 2:
duration = Duration(minutes: parsed);
break;
case 3:
duration = Duration(hours: parsed);
break;
return duration.inMilliseconds +
parseTimeString(
string.substring(
0,
string.lastIndexOf(splitString) == -1
? 0
: string.lastIndexOf(splitString)),
currentLayer: currentLayer + 1);
String timeToString(int millis)
Duration duration = Duration(milliseconds: millis);
String result = duration.toString();
while(result.substring(result.length-1)=="0")
result = result.substring(0,result.length-1);
if(result.substring(result.length-1)==".")
result += "0";
return result;
【讨论】:
我忘记了这段代码中的时间。但是添加它们应该很容易。 非常感谢您的帮助。我真的很喜欢这种方法!不过,我注意到了两件奇怪的事情:在 2:45.1 的时间内,我得到了 165001 毫秒。使用 DateTime.fromMillisecondsSinceEpoch 将其转换回来,我得到 '1970-01-01 01:02:45.001' 。我想'1970-01-01 01:00:00' 基本上是 DateTime 的'0',但是我如何将它从我的数据库中转换回来以显示在我的应用程序中?第二件事是我无法修复毫秒为原始的 1/100。 非常感谢!这很好用。我花了一点时间才弄清楚,但要转换毫秒以显示我使用的时间:``` format(Duration d) => d.toString().substring(0, 9);持续时间 newTime = new Duration(毫秒: (parseTimeString(myString)));打印(格式(新时间)); ```以上是关于将秒表“hh:mm:ss:ms”转换为存储在数据库中的主要内容,如果未能解决你的问题,请参考以下文章
使用 JavaScript 将 (YYYY/MM/DD HH:MM:SS.MS) GMT 转换为本地时间