2016-05-25 2 views
1

можно преобразовать строковое значение в формате ГГГГММДД к человеку-дружественной строке следующим образом:Как я могу получить MediumDateString?

string beginDate = GetElement(3, fileBaseName); 
string endDate = GetElement(4, fileBaseName); 
beginDate = DateTime.ParseExact(beginDate, 
    "yyyyMMdd", 
    CultureInfo.InvariantCulture).ToShortDateString(); 
endDate = DateTime.ParseExact(endDate, 
    "yyyyMMdd", 
    CultureInfo.InvariantCulture).ToShortDateString(); 
return string.Format("{0} to {1}", beginDate, endDate); 

Но использование ToShortDateString(), как указано выше, я получаю не-как-дружественны, как-нужный формат «4/1/2016 на 4/30/2016»

Когда я пытаюсь ToLongDateString(), он заходит слишком далеко в другом направлении, расширяя цифры в название месяцев (которые я хочу), но также обеспечивая длинную форму дня w еек, так что одни и те же значения отображаются как «пятницу, 01 апреля 2016 года в субботу, 30 апреля 2016»

То, что я действительно хочу для диапазона дат, который будет отображаться "апреля 1, 2016 30 апреля 2016 "(или" первый апреля 2016 года по 30 апреля 2016 «)

есть ли золотая середина между ToShortDateString() и ToLongDateStr ing(), который я могу использовать, или мне нужно «бросить свое», чтобы получить это?

ответ

4

Вы можете использовать свой собственный формат (MMMM d, yyyy):

beginDate = DateTime.ParseExact(beginDate, 
           "yyyyMMdd", 
           CultureInfo.InvariantCulture) 
        .ToString("MMMM d, yyyy"); 


endDate = DateTime.ParseExact(endDate, 
           "yyyyMMdd", 
           CultureInfo.InvariantCulture) 
        .ToString("MMMM d, yyyy"); 

return string.Format("{0} to {1}", beginDate, endDate); 

Выход:

April 1, 2016 to April 30, 2016 
+1

Остерегайтесь ParseExact и преобразования даты в локальный календарь, а также убедитесь, что вы указать вид потом, если результат не переводятся, как UTC – Jay

+0

Это «01» вместо «1» на дату, но достаточно близко для меня пока. –

+1

@ B.ClayShannon: обновлено, используйте только один 'd' в этом случае. –

5

Нет, нет ничего между этими двумя в .NET - если вы посмотрите на DateTimeFormatInfo вы будете см. ShortDatePattern и LongDatePattern, но нет «шаблона средней даты».

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

1

Чтобы получить именно то, что я хотел (без предварительного «0» до первого числа месяца), мне действительно нужно было «бросить» свое собственное:

private static string ToMediumDateString(string _date) 
{ 
    string yearPortion = _date.Substring(0, 4); 
    int monthNum = Convert.ToInt32(_date.Substring(4, 2)); 
    int dayNum = Convert.ToInt32(_date.Substring(6, 2)); 
    string monthName = CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(monthNum); 
    return String.Format("{0} {1}, {2}", monthName, dayNum, yearPortion); 
}