2016-10-03 10 views
2

私のアプリケーションは、渡された値を秒(時間)に変換するメソッドを作成しようとしています。したがって、それは動的である。 hh:mmまたはmm:ssまたはhh:mm:ssにすることができます。有効な時刻形式にすることができます。特定のファイルから取得する値は、常に時間の部分になります。フォーマットは、条件/要件に応じてユーザーが渡します。それは任意の有効な時刻形式にすることができます。C#ですべての形式を秒に変換する方法

私はTimespan.Parseを使用して

  1. を試してみましたが、それは形式を受け入れてはいけません。
  2. Timespan.ParseExactを使用していますが、コンパイラはtimespanに定義ParseExactが含まれていないというエラーを出しています。

その他のオプションは、フォーマットに応じて秒単位の変換ロジックを追加しています。また、すべてのフォーマットの条件を追加して解析メソッドを使用したくないというオプションもあります。それを達成するための他の一般的な方法はありますか?私は値と形式を渡すことができ、秒に変換する必要があります。私が試してみました他のものは、一般的なものから遠く離れていると、具体的

how to convert seconds in min:sec format

+6

hh:mmとmm:ssの違いは?これは私が素敵な一般的な例が信じられないほど難しいと思う主な理由です –

+0

@CallumBradburyはい、追加のロジックを書くことなく識別するのは難しいです、それは私が尋ねたかったものです。長いコード行 –

+0

'10:20'と入力したとします。 * 10時間20分* 10分20秒*ですか?あいまいさは、(一般的なケースでは)実装が不可能な作業になります。 –

答えて

0

私はこれが最高の可能な解決策かどうか、私は質問を投稿している間にそれをより複雑にした。以下は、私が実装したものであり、そのは、DateTimeオブジェクトに変換この「1:30」IMのような二重の形式で値を取得した後、私の要件

を満たす

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

任意の短所とがある場合このソリューションは私の答えをコメントしたり改善したりしてください。

0

さて、下のリンク内の1つのようにいずれかの形式に焦点を当て、曖昧は一般に実装する問題ができなくなりますケース、たとえば

10:20 

を見て、それが10時間20分あるので、答えは10 * 60 + 20 = 620秒に等しい10 * 3600 + 20 * 60 == 37200またはちょうど10分20秒である持っています。あなたは、この曖昧さを治療するための方法を知っていればしかし、あなたは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; 
    } 

テスト

// 23 hours 53 minutes == 85980 seconds 
    // Please, notice ambiguity: 23 minutes 53 seconds is also possible 
    // however the routine states that h:m should be tried first 
    Console.Write(InSeconds("23:53")); 
    // 47 minutes 53 seconds == 2873 seconds: 
    // hour:minutes tried first, fails and minutes:seconds succeeds 
    Console.Write(InSeconds("47:53")); 
    // 99:99 == NaN 
    // All three expected formats fail on such an input 
    Console.Write(InSeconds("99:99")); 

    // Custom format - 45240 
    Console.Write(InSeconds("12:34", @"hh\:mm")); 
    // Custom format - NAN: hh requires leading zeros (i.e. 01:34) 
    Console.Write(InSeconds("1:34", @"hh\:mm")); 
    // Custom formats: 1 day 12 hours 34 minutes - 131640 
    Console.Write(InSeconds("1.12:34", @"hh\:mm", @"d\.hh\:mm")); 

    // Custom format (unescaped, notice abscence of \) - 45240 
    Console.Write(InSeconds("12:34", @"hh:mm")); 
+0

TryParse.Exactを使用しようとしましたが、コンパイル時に "System.TimespanにTryParse.Exactの定義が含まれていません"というエラーが表示されます。 –

+0

@ Sam Sam: 'TimePanse.TryParseExact'(' TryParse'と 'Exact'の間にドットはありません) –

+0

は答えに記載されている時間形式であるか、それ以上のものがサポートされています同じように渡された?フォーマットが "hh:mm"になり、結果が返されませんでした。 –

0

この方法を試してください。

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; 
     } 
    } 

テスト:

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(); 
    } 
関連する問題