Должен ли я использовать ToString() или GetDateTimeFormats() для форматирования DateTime?

Я знаю, как отформатировать DateTime как String. Существует много способов форматирования DateTime как String, и я нашел несколько вопросов, связанных с форматированием DateTime.

Но я нашел и попробовал два способа:

  • GetDateTimeFormats()
  • 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;
    }
}

У меня есть класс Global с методом Global для форматирования DateTime как String. Но вот что я хочу знать, какой метод является лучшей практикой, поэтому я могу его использовать? Метод вызывается по всему приложению.

Ответ 1

GetDateTimeFormats не заменяет ToString и наоборот. Если вы знаете, какой формат вы хотите, нет необходимости звонить GetDateTimeFormats. Как и более ясное использование ToString, document для GetDateTimeFormats заявляет это (основное внимание)

Поскольку этот метод использует данные, чувствительные к культуре, , вы не должны предполагать что несколько вызовов метода возвращают идентичные данные. Данные возвращаемый этим методом, может измениться, если текущая культура изменится, пользователь переопределяет отдельные культурные настройки или обновляется культурные данные системы.

Это может привести к повреждению вашего кода, поскольку третий элемент может быть чем-то другим, когда он запускается в другой культуре.

Используя ToString, вы избегаете перебирать все форматы дат (следовательно, являетесь более эффективными), и вы разъясняете, какой формат вам нравится, гарантируя, что возвращаемый формат является тем, который вам нужен.

Ответ 2

ToString понятнее, а также не использует магическое число, которое может не работать в следующей версии среды/другой культуре. Используйте ToString().

Ответ 3

Какая из них - хорошая практика или лучший способ.

Оба хороши для своих нужд.

разница между этими двумя способами?

GetDateTimeFormats()

Преобразует значение этого экземпляра во все представления строк, поддерживаемые стандартными спецификаторами формата даты и времени. Это означает, что это дорогостоящая операция, и получение третьего элемента каждый раз может дать вам разные результаты. Вам не нужно преобразовывать во все форматы, поэтому зачем это делать?

ToString()

Преобразует значение текущего объекта DateTime в его эквивалентное строковое представление с использованием указанного формата.

Любые предложения или идеи?

В качестве второго метода (ToString) используется только преобразование в требуемый формат и более читаемо. Отсюда предпочтительнее. Принимая во внимание, что если вы используете первый метод, вы будете конвертировать около 100 форматов, если требуется только один.

Ответ 4

Я предпочитаю только версию 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-yyyy, когда вы произнесете MM/dd/yyyy? потому что / - специальный символ, который используется для представления DateTimeFormatInfo.DateSeperator текущей культуры.

Итак, я предлагаю вам использовать настраиваемое форматирование без / для сериализации и любого другого форматирования для пользовательского интерфейса.

Ответ 5

Я использую .ToString(формат) в течение многих лет, и это меня не подвело. Вы можете использовать встроенные форматы или настраивать свои собственные.

Ответ 6

Если вам нужна только дата и, как я вижу, формат культуры верен, просто используйте метод datetime ToShortDateString

MyDateTime.ToShortDateString();

Но использование этого метода extesion не имеет никакого смысла. Если вы хотите конвертировать любую дату в любом формате, чтобы всегда отображаться в MM/dd/yyyy, вы должны сначала установить культуру и вызвать метод.

Проверьте правильность использования кода http://msdn.microsoft.com/es-es/library/system.datetime.toshortdatestring.aspx