2016-05-11 6 views
1

私はDateの部分を平らにし、時間の値だけを保持する必要がある一連のdatetimesを持っています。新しいDateTimeインスタンスを作成するよりも、DateTimeオブジェクトのDate部分を平坦化するための効率的な方法はありますか?

注:このような奇妙なことを行う理由は、Date Partを使用して特定の決定を下す第三者コンポーネントを使用することにあります。また、私はそれを回避する別の方法を見つけましたが、これを達成するためのより効率的な方法があれば、私はまだ不思議です。

私が考えることができる唯一の方法は、同じ日付であるが、個々のソースDTオブジェクトからの時間とともに新しいDateTimeオブジェクトを作成することです。

これは私がまったく気に入らないアプローチの簡単な例です。

DateTime flattenDts(DateTime input) 
    { 
     return new DateTime(1, 1, 1, input.Hour, input.Minute, input.Second); 
    } 

ご覧のとおり、これはあまり良くありません。特に何百ものdatetime値がある場合

これを達成するより効率的な方法はありますか?

編集: 第三者のlibとしてtimespanを使用することはできません。 DateTimeパラメータのみを使用します。

+2

TimeSpan time = input.TimeOfDay クリーナー? – LDJ

+0

TimeSpanを使用できます。https://msdn.microsoft.com/en-us/library/system.timespan%28v=vs.110%29.aspx –

+0

サードパーティのコンポーネントにTimeSpan /文字列を使用できますか? DateTimeオブジェクトが必要ですか? – Marco

答えて

1

documentationDateTimeによれば、プロパティは読み取り専用です。つまり、基本的にDateTimeは不変です。コンテンツの変更が必要な場合は、これは新しいオブジェクトでのみ可能です。つまり、より効率的な解決法はありません。

+1

非常に少ない単語で優れた説明! – Menol

5

あり、これを行うには、より効率的な方法でませんが、あなたは、あなたがそれを行うための拡張メソッドを書くことで実行する必要がありタイピングの量を減らすことができます:

public static class DateTimeExt 
{ 
    public static DateTime Flatten(this DateTime self) 
    { 
     return new DateTime(1, 1, 1, self.Hour, self.Minute, self.Second); 
    } 
} 

次に日付を平らにするためのコードは次のようになりますこれは:

DateTime test = DateTime.Now; 

var flattened = test.Flatten(); 

多少はありますが、おそらく少しは助けになります。 @Matthewワトソンが提案されているよう

1

私は簡単に使用方法については構造

new DateTime(input.TimeOfDay.Ticks) 

を使用することですもう少し効率的だと思う(および必要に応じて、実装の変更)、拡張メソッドの内部でそれを置きます。私はそれをTruncateDateと呼ぶが、これは必須ではない。

関連する問題