私はc#mvc4を使用しています。作成日メンバーを持つすべてのエンティティで、DateTime を DB に DateTime.UtcNow として保存しています。エンティティを表示するビューが多数あり、html: @item.Created が何度も繰り返されます。デフォルトの ToString() を ToLocalTime にしたいのですが、これを宣言できる場所は 1 つありますか? おそらくデフォルトの ToString() をオーバーライドします
3 に答える
はい、もちろん ToString() メソッドをオーバーライドできます。
詳細については、 http://msdn.microsoft.com/en-us/library/ms173154 (v=vs.80).aspxを参照してください。
ただし、別の場所でデフォルトの ToString() 拡張機能を使用できるため、拡張メソッドを使用してニーズを実現することをお勧めします。
/Update: 日時を null 値にできる拡張メソッドを使用する (常に何かがうまくいかない)。これは、すべての DateTime 値で呼び出すことができます。次に、メソッドは null かどうかをチェックします。この場合、string.empty を返します。それ以外の場合は、好きな形式で Datetime を返します。
public static string ToLocalString(this DateTime? date)
{
if(date == null)
{
return String.Empty;
}
else
{
return date.ToLocalString().ToString();
}
}
DateTime のデフォルトの .ToString() をオーバーライドして、拡張メソッドをより適切に使用するべきではないという Serv の回答に同意します。次のように Property getter を使用するオプションがあることを追加したかっただけです。
private DateTime _created;
public DateTime Created
{
get {
return _created.ToLocalTime();
}
}
しかし、私の意見では、拡張メソッドが最適なオプションです。
.ToString()
いいえ、 で上書きすることはできませんDateTime
。
DateTime
クラスではなく構造体です。しかも封印です。
拡張メソッドは良いアイデアですが、自動的には呼び出されません。必要なときに呼び出す必要があります。
DateTime.ToString()
グローバルの動作を変更する単一の場所が必要だとおっしゃいました。それを行う方法はありません。おそらくそうするのは危険です。結局のところ、UTC 値を使用しているのには理由があります。ローカル値が必要な場合は、ローカル値を使用してください。
これを達成できると私が考える唯一の方法は、PostSharpのような AOP フレームワークで一般的に行われているビルド後のステップを使用することです。変換を行うアスペクトを書くことができます。しかし、繰り返しになりますが、私は一般的にこの考えに反対することを強くお勧めします.