【问题标题】:Convert duration from 0:00 or 00:00 to 00:00:00将持续时间从 0:00 或 00:00 转换为 00:00:00
【发布时间】:2011-09-13 09:45:28
【问题描述】:

我正在开发一个应用程序,它可以在 C# 中转换媒体文件的 STRING 持续时间。 如何使输出如下:

一个。 1:34(1分34秒)到 00:01:34

b. 0:05(5 秒)到 00:00:05

c。 1:10:05 到 01:10:05

结果将显示在名为 lblDuration 的标签中。

我正在使用 VS2008 C#。

如果你能帮忙,谢谢。

【问题讨论】:

  • 正则表达式似乎没有帮助,因为格式可以是 1:34 或 01:34
  • 输入是字符串,输出是字符串吗?好像是这样,只是想确定一下。
  • 试试String.Format({0:hh:mm:ss}, strYourTime);
  • 你检查过 TimeSpan.Parse 和 TimeSpan.ParseExact 方法了吗?
  • @Camus - 你的代码仍然给了我 1:34,这是我不想要的。

标签: c# time format duration


【解决方案1】:

我会将其解析为TimeSpan,然后使用重新格式化

string text = timeSpan.ToString("hh':'mm':'ss");

这是假设您使用的是支持 custom TimeSpan formats 的 .NET 4。在 .NET 4 之前,您必须自己编写它 - 不是太难,但比上面更难。

解析开始的时间跨度是另一回事 - 例如,您可以使用 TimeSpan.TryParseExact 传递多种格式。

解析然后重新格式化的好处是您将验证您是否有合理的日期 - 例如不是“99:99”。

【讨论】:

  • 我很想使用时间跨度,但我如何解析像 1:34 这样的东西?
  • @midend:使用 TimeSpan.TryParseExact,将“m:ss”作为格式字符串传递。可以给TryParseExact多种格式依次尝试。
  • =.= 这似乎是相当多的工作......不过我会尝试一下
  • @midend 不幸的是,如果你想做一些正确的事情,它通常会涉及工作。
  • 由于某种原因,“hh:mm:ss”抛出了格式异常——不得不使用timeSpan.ToString(@"hh\:mm\:ss");
【解决方案2】:

用冒号 (':') 分割字符串,将每个元素转换为数字并使用 %02d 打印每个数字,在第 1 和第 2 以及第 2 和第 3 之间放置一个 ':'

【讨论】:

    【解决方案3】:

    我认为最好的方法是使用TimeSpan.TryParse,但我们必须小心 - 如果该方法看到一个输入字符串只有一个:,它会将其解析为hours:minutes

    TryParseExact 变得很复杂,因为没有一种格式可以同时接受前导零和不存在前导零)。

    所以:

    var input = "5:06";
    
    TimeSpan ts;
    
    var parseSuccessful = TimeSpan.TryParse(input, out ts);
    
    if  (parseSuccessful)
    {
        if (input.Count(c => c == ':') == 1)
        {
            // TryParse parsed this as hh:mm but we want it to mean mm:ss
            // so scale appropriately
            ts = new TimeSpan(ts.Ticks / 60);
        }
    
        Console.WriteLine(ts.ToString(@"hh\:mm\:ss"));
    }
    

    【讨论】:

      【解决方案4】:

      如何将其解析为 DateTime 对象然后以这种方式格式化它,例如

      DateTime.ParseExact("1:32", 'H:mm', CultureInfo.InvariantCulture).ToString("HH:mm:ss");
      

      澄清一下 - 上述解决方案是 .NET 4 之前版本的解决方法,您无法访问自定义 TimeSpan 格式。如果您使用的是 .NET 4,那么我绝对会推荐使用 @Jon 建议的 TimeSpan

      【讨论】:

      • 将其解析为 DateTime 对我来说是个坏主意,因为它是 note DateTime - 它基本上是 TimeSpan。如果 OP 没有使用 .NET 4,这可能是一种解决方法。
      • @Jon - Defo 同意,我也打算建议 Timespan,但是,你打败了我。因此,尝试跳出框框思考 4 之前的版本的解决方案 :)
      • 有道理。可能值得编辑您的答案以解释该推理:)
      【解决方案5】:
          private static string GetLable(string text)
          {
              if (string.IsNullOrEmpty(text))
                  return "00:00:00";
              var builder = new StringBuilder();
              var arr = text.Split(new[] { ':' }, StringSplitOptions.RemoveEmptyEntries);
              if (arr.Length == 2)
                  builder.Append("00:");
              var i = 0;
              foreach (var t in arr)
              {
                  builder.Append(t.Length == 1 ? "0" + t : t);
                  if (arr.Length - 1 != i++)
                      builder.Append(":");
              }
              return builder.ToString();
          }
      

      【讨论】:

        【解决方案6】:
        public void convertString()
        
            {
        
                string str;
        
                str = "your time";
        
                int length = str.Length;
        
                if (length == 4)
        
                {
        
                    str = "00" + ":" +"0"+ str;
        
               }
        
                if (length == 5)
        
               {
                    str = "00" + ":" + str;
        
                }
        

        }

            static void Main(string[] args)
        
            {
        
                Program p = new Program();
        
                p.convertString();
        
            }
        

        【讨论】:

        • 可能有问题,因为返回的字符串也可以是1:4。
        猜你喜欢
        • 2014-02-19
        • 2010-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多