2013-08-23 2 views
10

Я знаю, как отформатировать DateTime как String. Может быть много способов форматировать DateTime как String, и я нашел несколько вопросов, связанных с форматированием DateTime.Должен ли я использовать ToString() или GetDateTimeFormats() для форматирования DateTime?

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

  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; 
    } 
} 

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

+2

FYI 'DateTime' не имеет формат. Он хранится как 'Long (Ticks)'. Строковое представление 'DateTime' только принадлежит формату –

+4

+1 странно, никогда не слышал о' DateTime.GetDateTimeFormats'. –

ответ

8

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

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

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

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

+1

true. если вы знаете, что хотите, позвоните. Не нужно извлекать с помощью ведра, а затем выбирать его. – no9

6

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

3

Какой из Good Practice или Лучший способ

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

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

GetDateTimeFormats()

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

ToString()

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

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

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

2

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

3

Я предпочитаю 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 текущей культуры.

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

2

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

MyDateTime.ToShortDateString(); 

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

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

+0

Я согласен, что это тоже один из способов., – RajeshKdev

+0

Отредактировано для исправления некоторых орфографических ошибок – Gonzix

Смежные вопросы