web-dev-qa-db-ja.com

ToString()またはGetDateTimeFormats()を使用してDateTimeをフォーマットする必要がありますか?

DateTimeStringとしてフォーマットする方法を知っています。 DateTimeStringとしてフォーマットする方法はたくさんあるかもしれませんが、DateTimeのフォーマットに関連する質問がいくつか見つかりました。

しかし、私は2つの方法を見つけて試しました:

  1. GetDateTimeFormats()
  2. ToString("MM/dd/yyyy")

私はこのコードを試しました:

public static class DateTimeFormates
{
    public static string FormatMyDate(this DateTime DT)
    {
        // My Actual Date Time Comes in this Format
        //8/23/2013 12:43:12 PM

        // I'm expecting Format like below

        String FormatWayOne = DT.GetDateTimeFormats()[3];
        //08/23/2013

        String FormatWayTwo = DT.ToString("MM/dd/yyyy");
        //08/23/2013

        return FormatWayOne;
    }
}

GlobalGlobalとしてフォーマットするDateTimeメソッドを持つStringクラスがあります。しかし、ここで私が知りたいのは、それを使用できるようにするためのベストプラクティスですか?このメソッドは、アプリケーション全体で呼び出されます。

12
RajeshKdev

GetDateTimeFormatsToStringの代わりではなく、その逆も同様です。必要な形式がわかっている場合は、GetDateTimeFormatsを呼び出す必要はありません。 ToStringを使用する方が明確であるだけでなく、GetDateTimeFormatsの-​​ document はこれを述べています(私の強調)

このメソッドはカルチャに依存するデータを使用するため、メソッドを複数回呼び出すと同じデータが返されると想定しないでください。このメソッドによって返されるデータは、現在のカルチャが変更された場合、ユーザーが個々のカルチャ設定を上書きした場合、またはシステムのカルチャデータが更新された場合に変更される可能性があります。

3番目の要素は別のカルチャで実行すると別のものになる可能性があるため、これによりコードが破損する可能性があります。

ToStringを使用することで、すべての日付形式をループする必要がなくなり(したがって、より効率的になります)、返される形式が目的の形式であることを確認しながら、どの形式が好きかを明確にすることができます。

9
keyboardP

ToStringはより明確であり、次のフレームワークバージョン/別のカルチャでは機能しない可能性があるマジックナンバーも使用していません。 ToString()を使用します。

6
It'sNotALie.

私はToString(format)バージョンのみを好みます。ただし、例として示した形式ではありません。それは文化全体にあなたをねじ込むことができます。次の例を見てみましょう。

    DateTime now = DateTime.Now;

    string fmt1 = now.ToString("MM/dd/yyyy"); // MM/dd/yyyy
    Thread.CurrentThread.CurrentCulture = new CultureInfo("en-us")
    { 
        DateTimeFormat=
        {
            DateSeparator = "-"
        }
    };
    string fmt1a = now.ToString("MM/dd/yyyy"); // MM-dd-yyyy (you're in trouble when you want to deserialize)

    string fmt2 = now.ToString("MMddyyyy"); // MMddyyyy
    Thread.CurrentThread.CurrentCulture = new CultureInfo("en-us")
    {
        DateTimeFormat =
        {
            DateSeparator = "-"
        }
    };
    string fmt2a = now.ToString("MMddyyyy"); and // MMddyyyy always

GetDateTimeFormatsについては、やりすぎなのでここでは触れません。

fmt1aと言うと、MM-dd-yyyyMM/dd/yyyyを返す方法を知りたいですか? /は、現在のカルチャーのDateTimeFormatInfo.DateSeperatorを表すために使用される特殊文字であるためです。

したがって、シリアル化には/を使用せずにカスタムフォーマットを使用し、UIにはその他のフォーマットを使用することをお勧めします。

3

グッドプラクティスとベストウェイのどちらか

どちらも自分のニーズに適しています。

この2つの方法の違いは?

GetDateTimeFormats()

このインスタンスの値を、標準の日付と時刻の形式指定子でサポートされているすべての文字列表現に変換します。つまり、これはコストのかかる操作であり、毎回3番目の要素を取得すると異なる結果が得られる可能性があります。すべての形式に変換する必要はないのに、なぜそうするのですか?

ToString()

指定された形式を使用して、現在のDateTimeオブジェクトの値を同等の文字列表現に変換します。

提案やアイデアはありますか?

2番目のメソッド(ToString)は、必要な形式に変換するだけなので、より読みやすくなります。したがって、好ましい。一方、最初の方法を使用すると、1つだけ必要な場合に約100の形式に変換されます。

3
Ehsan

私は何年も.ToString(format)を使用してきましたが、決してがっかりすることはありません。組み込みの形式を使用することも、独自の形式をカスタマイズすることもできます。

2
Spikeh

日付のみが必要で、私が見るように、カルチャ形式が正しい場合は、datetimeメソッドToShortDateStringを使用してください。

MyDateTime.ToShortDateString();

しかし、これを拡張メソッドで使用しても意味がありません。任意の日付を任意の形式に変換して常にMM/dd/yyyyで表示する場合は、最初に設定してからカルチャを設定し、メソッドを呼び出す必要があります。

使用する適切なコードについては、こちらを確認してください http://msdn.Microsoft.com/es-es/library/system.datetime.toshortdatestring.aspx

2
Gonzix