C# 如何在C中将每种格式转换为秒#

C# 如何在C中将每种格式转换为秒#,c#,datetime,data-conversion,C#,Datetime,Data Conversion,我的应用程序是C#,我试图创建一个方法,将传递的值转换为秒(时间),即将到来的格式不是固定的,由用户提供,因此它是动态的。它可以是hh:mm或mm:ss或hh:mm:ss,可以是任何有效的时间格式。我将从某个文件获得的值将始终是时间部分。用户将根据条件/要求传递格式。它可以是任何有效的时间格式 我已经试过了 使用Timespan.Parse,但它不接受该格式 使用Timespan.ParseExact,但我的编译器给出的错误是Timespan不包含ParseExact的定义 另一个选项是,我根据

我的应用程序是C#,我试图创建一个方法,将传递的值转换为秒(时间),即将到来的格式不是固定的,由用户提供,因此它是动态的。它可以是hh:mm或mm:ss或hh:mm:ss,可以是任何有效的时间格式。我将从某个文件获得的值将始终是时间部分。用户将根据条件/要求传递格式。它可以是任何有效的时间格式

我已经试过了

  • 使用Timespan.Parse,但它不接受该格式
  • 使用Timespan.ParseExact,但我的编译器给出的错误是Timespan不包含ParseExact的定义
  • 另一个选项是,我根据格式添加转换为秒的逻辑,我也不想为每种格式添加条件,然后使用parse方法。有没有其他通用的方法可以达到同样的效果?这样我可以传递值和格式,它应该转换为秒。我尝试过的其他方法远远不是通用的,而是专门针对任何一种格式,如下面链接中的格式

    嗯,模糊性使问题无法在一般情况下实施,例如,查看

      10:20
    
    是10小时20分钟,答案是
    10*3600+20*60==37200
    还是10分20秒,等于
    10*60+20=620
    秒。但是,如果您知道如何处理这种歧义,可以使用
    TryParseExact

      private static double InSeconds(string value, params string[] formats) {
        // if no formats provided, use default ones:
        // try these formats in this particular order:
        if ((null == formats) || (formats.Length <= 0))
          formats = new string[] { 
            @"h\:m\:s", 
            @"h\:m", 
            @"m\:s" }
        else
          // In case of unescaped formats like "h:m" (see comments below)
          // we automatically escape them
          for (int i = 0; i < formats.Length; ++i)
            if (formats[i] != null)
              formats[i] = Regex.Replace(formats[i], 
                @"(?<!\\)[^A-Za-z\\]", 
                match => @"\" + match.Value);
    
        TimeSpan result; 
    
        if (TimeSpan.TryParseExact(value, formats, CultureInfo.InvariantCulture, out result))
          return result.TotalSeconds;
        else
          return double.NaN;  
      }
    
    试试这个:

        class TimeParser
        {
            Regex tripleReg = new Regex(@"([\d]{1,2}):([\d]{1,2}):([\d]{1,2})");
            Regex doubleReg = new Regex(@"([\d]{1,2}):([\d]{1,2})");
    
            public enum Format
            {
                HoursMinutesSeconds,
                HoursMinutes,
                MinutesSeconds
            }
    
            public TimeSpan Parse(string data)
            {
                if (tripleReg.IsMatch(data))
                    return Parse(data, Format.HoursMinutesSeconds);
                else
                {
                    var match = doubleReg.Match(data);
    
                    var segment = match.Groups[1];
                    var value = int.Parse(segment.Value);
    
                    if (value < 60)
                        return Parse(data, Format.MinutesSeconds);
                    else
                        return Parse(data, Format.HoursMinutes);
                }
            }
    
            public TimeSpan Parse(string data, Format format)
            {
                TimeSpan result;
                Match match;
    
                var hours = 0;
                var minutes = 0;
                var seconds = 0;
    
                switch (format)
                {
                    case Format.HoursMinutesSeconds:
                        match = tripleReg.Match(data);
                        if (match.Success)
                        {
                            int.TryParse(match.Groups[1].Value, out hours);
                            int.TryParse(match.Groups[2].Value, out minutes);
                            int.TryParse(match.Groups[3].Value, out seconds);
                        }
                        break;
                    case Format.HoursMinutes:
                        match = doubleReg.Match(data);
                        if (match.Success)
                        {
                            int.TryParse(match.Groups[1].Value, out hours);
                            int.TryParse(match.Groups[2].Value, out minutes);
                        }
                        break;
                    case Format.MinutesSeconds:
                        match = doubleReg.Match(data);
                        if (match.Success)
                        {
                            int.TryParse(match.Groups[1].Value, out minutes);
                            int.TryParse(match.Groups[2].Value, out seconds);
                        }
                        break;
                    default:
                        break;
                }
    
                result = new TimeSpan(hours, minutes, seconds);
    
                return result;
            }
        }
    

    我不知道这是否是最好的解决方案,或者我在发布问题时是否让问题变得更复杂。下面是我已经实现的,它满足了我的需求

    在获得像“01:30”这样的双格式值后,我将其转换为Datetime对象

    var DateObj= Convert.ToDateTime("MyValue");
    DateObj.ToString("MyFormat");
    var TempVariable=DateObj.TimeOfDay.TotalSeconds;
    

    如果此解决方案存在任何不足之处,请评论或改进我的答案

    您如何区分hh:mm和mm:ss?这是我认为一个很好的通用示例很难出现的主要原因with@CallumBradbury是的,不写任何附加逻辑就很难识别,这就是我想问的,如果不写长行代码就可以实现的话。假设你有
    10:20
    作为输入。是10小时20分还是10分20秒?模棱两可使您的任务(一般情况下)无法实现。再多的附加逻辑也无法帮助您了解用户的想法。您是说用户将提供值和格式,还是仅提供值?我尝试过使用TryParse。精确,但在编译期间,我只得到如下错误“System.Timespan不包含TryParse.Exact的定义”。@Sam Sam:请注意,
    Timespan.TryParseExact
    (TryParse和
    Exact
    之间没有点)答案中提到的时间格式是否受支持,或者支持更多的时间格式,以及以相同的方式传递的格式?正如我传递的格式“hh:mm”一样“它没有返回任何结果。是的,我认为这是框架问题,我的解决方案是在框架3.5中,它不支持TryParseExact方法。我正在用Framework4检查这个示例应用程序。5@SamSam:您的格式字符串可能有误,它应该是
    @“hh \:mm”
    小时:分钟
    带强制前导零;详见
        static void Main(string[] args)
        {
            var parser = new TimeParser();
    
            Console.WriteLine(parser.Parse("60:34").TotalSeconds); //218040 seconds, hh:mm
    
            Console.WriteLine(parser.Parse("55:10").TotalSeconds); //3310 seconds, mm:ss
    
            Console.WriteLine(parser.Parse("3:33:34").TotalSeconds); //12814 seconds, hh:mm:ss
    
            Console.WriteLine(parser.Parse("12:34", TimeParser.Format.HoursMinutes).TotalSeconds); //45240 seconds
    
            Console.WriteLine(parser.Parse("55:10", TimeParser.Format.MinutesSeconds).TotalSeconds); //3310 seconds
    
            Console.WriteLine(parser.Parse("3:33:34", TimeParser.Format.HoursMinutesSeconds).TotalSeconds); //12814 seconds
    
            Console.ReadKey();
        }
    
    var DateObj= Convert.ToDateTime("MyValue");
    DateObj.ToString("MyFormat");
    var TempVariable=DateObj.TimeOfDay.TotalSeconds;