Формат строки DateTimeFormatInfo для дня недели. Четверг становится че - PullRequest
6 голосов
/ 16 июня 2010

Существует ли шаблон формата DateTimeFormatInfo для преобразования дня недели в два символа? Например, вторник становится Ту, среда становится Мы. Строка формата должна соответствовать DateTimeFormatInfo для форматов даты.

Дополнительно:

Может быть, я ищу решение расширить DateTimeFormatInfo для включения пользовательских форматов?

Ответы [ 4 ]

18 голосов
/ 16 июня 2010

Закрытие, которое вы можете получить, - это "ddd" пользовательский формат спецификатора - это дает три буквенных сокращения, поэтому не совсем то, что вы хотите. Там нет ничего встроенного, что делает именно то, что вы хотите.

Вы всегда можете взять первые два символа этого:

DateTime.Now.ToString("ddd").Substring(0,2);

К сожалению, вы не можете расширить DateTimeFormatInfo, поскольку он объявлен как sealed.

4 голосов
/ 17 июня 2010

Вам нужно получить DateTimeFormatInfo культуры, с которой вы работаете, а затем изменить массив строк с именем AbbreviatedDayNames.После этого ddd вернет вам Th.

http://msdn.microsoft.com/en-us/library/system.globalization.datetimeformatinfo.abbreviateddaynames(VS.71).aspx

DateTimeFormatInfo.AbbreviatedDayNames Получает или задает одномерный массив типа String, содержащий сокращенные названия дней недели для конкретной культуры.

Вот пример того, как это сделать:

class Program
{
    static void Main()
    {
        var dtInfo = new System.Globalization.DateTimeFormatInfo();            
        Console.WriteLine("Old array of abbreviated dates:");
        var dt = DateTime.Today;
        for (int i = 0; i < 7; i++)
        {
            Console.WriteLine(dt.AddDays(i).ToString("ddd", dtInfo));
        }

        // change the short weekday names array
        var newWeekDays = 
            new string[] { "Su", "Mo", "Tu", "We", "Th", "Fr", "Sa" };
        dtInfo.AbbreviatedDayNames = newWeekDays;

        Console.WriteLine("New array of abbreviated dates:");
        for (int i = 0; i < 7; i++)
        {
            Console.WriteLine(dt.AddDays(i).ToString("ddd", dtInfo));
        }

        Console.ReadLine();
    }
}

Еще одно примечание: конечно, если вы ограничены в предоставлении IFormatProvider, тогда вы можете переопределить текущий поток CultureInfo, например:

CultureInfo customCulture = CultureInfo.CreateSpecificCulture("en-US");
// ... set up the DateTimeFormatInfo, etc...

System.Threading.Thread.CurrentThread.CurrentCulture = customCulture;

Подробнее о CurrentCulture:

http://msdn.microsoft.com/en-us/library/system.threading.thread.currentuiculture.aspx

Thread.CurrentUICulture Property Получает или задает текущую культуру, используемую Resource Manager для поиска ресурсов, специфичных для данной культуры, во время выполнения.

1 голос
/ 16 июня 2010

Чтобы использовать DateTimeFormatInfo, в частности, вы можете

dtfi.GetShortestDayName(DateTime.Now.DayOfWeek);

, однако "ddd" - ближайший, который вы получите для строкового формата

1 голос
/ 16 июня 2010

попробуйте

string s = DateVar.ToString("ddd").SubString(0,2);

Если это должен быть FormatPattern, попробуйте следующее:

var dtFI = new CultureInfo( "en-US", false).DateTimeFormat;
dtFI.DayNames = new[] {"Mo", "Tu", "We", "Th", "Fr", "Sa", "Su" };
string s = DateVar.ToString("ddd", dtFI);
...