2017-10-02 1 views
3

タイムスタンプ文字列をTimeSpanオブジェクトに変換しようとしています。 しかし、TimeSpan.Parse()は私が期待するように動作しません。理由を説明します。h:m:sとm:sの文字列をTimeSpanオブジェクトに変換する簡単な方法は何ですか?

変換したいタイムスタンプには2種類あります。

  1. 分:秒
    30:53,1:23,0:05
  2. 時間:分:秒
    TimeSpan.Parse()方法で分形式:1:30:532:1:230:0:3

問題は、タイプ1の時間として解釈されます。

Console.WriteLine(TimeSpan.Parse("12:43")); 
// the result I expect -> 0:12:43 
// the actual result -> 12:43:00 

私はこの問題を検出し、このSOのポストを見つけました。
Parse string in HH.mm format to TimeSpan

これは、DateTime.ParseExact()を使用して特定の形式の文字列を解析します。しかし、問題はタイプ1とタイプ2で異なるフォーマットを使用する必要があるということです。

// ok 
var ts1 = DateTime.ParseExact("7:33", "m:s", CultureInfo.InvariantCulture).TimeOfDay; 
// throws an exception 
var ts2 = DateTime.ParseExact("1:7:33", "m:s", CultureInfo.InvariantCulture).TimeOfDay; 
// throws an exception 
var ts3 = DateTime.ParseExact("7:33", "h:m:s", CultureInfo.InvariantCulture).TimeOfDay; 
// ok 
var ts4 = DateTime.ParseExact("1:7:33", "h:m:s", CultureInfo.InvariantCulture).TimeOfDay; 

私はMSDNもチェックしましたが、それは役に立ちませんでした。
https://msdn.microsoft.com/ja-jp/library/se73z7b9(v=vs.110).aspx

私が思い描いた解決策は次のとおりです。

とA. DateTime.ParseExact場合

string s = "12:43"; 
TimeSpan ts; 
if (s.Count(c => c == ':') == 1) 
    ts = DateTime.ParseExact(s, "m:s", CultureInfo.InvariantCulture).TimeOfDay; 
else 
    ts = DateTime.ParseExact(s, "h:m:s", CultureInfo.InvariantCulture).TimeOfDay; 

B. TimeSpan.Parse

string s = "12:43"; 
if (s.Count(c => c == ':') == 1) 
    s = "0:" + s; 
var ts = TimeSpan.Parse(s); 

しかし、それらの両方が長いとされていない場合は "クール"。私は車輪を再発明しているように感じます。私は彼らを望んでいません。

h:m:sとm:sの文字列をTimeSpanオブジェクトに変換する簡単な方法は何ですか?

ありがとうございます!

答えて

5

あなたはTimeSpan.ParseExactいくつかのの形式を指定することができます。

string source = "17:29"; 

    TimeSpan result = TimeSpan.ParseExact(source, 
    new string[] { @"h\:m\:s", @"m\:s" }, 
    CultureInfo.InvariantCulture); 

コードでは最初のフォーマットが失敗した場合、我々は最初のh:m:sフォーマットを試し、その後m:s上。

試験:

string[] tests = new string[] { 
    // minutes:seconds 
    "30:53", "1:23", "0:05", 
    // hours:minutes:seconds 
    "1:30:53", "2:1:23", "0:0:3" }; 

    var report = string.Join(Environment.NewLine, tests 
    .Select(test => TimeSpan.ParseExact(
     test, 
     new string[] { @"h\:m\:s", @"m\:s" }, 
     CultureInfo.InvariantCulture))); 

    Console.Write(report); 

結果:

00:30:53 
00:01:23 
00:00:05 
01:30:53 
02:01:23 
00:00:03 
関連する問題