将秒表“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 转换为本地时间

如何编写此函数来计算日期时间差异为 hh:mm:ss:ms

如何制作一个以 hh:mm:ss:ms 计算的 Swift 3.0 计时器

AIX 转换时间戳

java 调用 ffmpeg 进行视频截取

将毫秒转换为分和秒?