В приведенном ниже примере программы демонстрируется применение нескольких форматов даты и времени.

// Отформатировать дату и время, используя специальные форматы, using System;

class CustomTimeAndDateFormatsDemo { static void Main() {

DateTime dt = DateTime.Now;

Console.WriteLine("Время: {0:hh:mm tt}", dt) ;

Console.WriteLine("Время в 24-часовом формате: {0:HH:mm}", dt) ;

Console.WriteLine("Дата: {0:ddd МММ dd, yyyy}", dt) ;

Console.WriteLine("Эра: {0:gg}", dt) ;

Console.WriteLine("Время в секундах: " +

"{0:HH:mm:ss tt}", dt) ;

Console.WriteLine("День месяца в формате m: {0:m}", dt);

Console.WriteLine("Минуты в формате m: {0:%m}", dt);

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

Время: 11:19 AM

Время 24-часовом формате: 11:19 Дата: Thu Feb 11, 2010 Эра: A.D.

Время в секундах: 11:19:40 AM День месяца в формате m: February 11 Минуты в формате ш: 19

Форматирование промежутков времени

Начиная с версии 4.0, в среде .NET Framework появилась возможность форматировать объекты типа Time Span — структуры, представляющей промежуток времени. Объект типа Time Span может быть получен самыми разными способами, в том числе и в результате вычитания одного объекта типа DateTime из другого. И хотя форматировать объекты типа Time Span приходится нечасто, о такой возможности все же стоит упомянуть вкратце.

По умолчанию в структуре Time Span поддерживаются три стандартных спецификатора формата даты и времени: с, g и G. Они обозначают инвариантную форму промежутка времени, короткую и длинную форму с учетом культурной среды соответственно (последняя форма всегда включает в себя дни). Кроме того, в структуре Time Span поддерживаются специальные спецификаторы формата даты и времени, приведенные в табл. 22.9. Вообще говоря, если один из этих спецификаторов используется в отдельности, его нужно предварить символом %.

Таблица 22.9. Символы-заполнители специального формата промежутка времени

 

Символ-заполнитель

 

Назначение

 

d, dd,

 

ddd, dddd,

 

Целые дни. Если указано несколько символов-заполнителей

 

ddddd,

 

dddddd,

 

ddddddd

 

d, то отображается, по крайней мере, указанное количество цифр с начальными нулями, если требуется

 

h, hh

 

Часы (не считая тех, что составляют часть целого дня). Если указано hh, то отображаются две цифры с начальными нулями, если требуется

 

m, mm

 

Минуты (не считая тех, что составляют часть целого часа). Если указано mm, то отображаются две цифры с начальными нулями, если требуется

 

s, ss

 

Секунды (не считая тех, что составляют часть целой минуты). Если указано ss, то отображаются две цифры с начальными нулями, если требуется

 

f, ff,

 

fff, ffff,

 

Дробные доли секунды. Количество символов-заполнителей

 

fffff,

 

ffffff,

 

fffffff

 

f обозначает точность представления, а остальные цифры отбрасываются

 

F, FF,

 

FFF, FFFF,

 

Дробные доли секунды. Количество символов-заполнителей

 

FFFFF,

 

FFFFFF,

 

FFFFFFF

 

F обозначает точность представления, а остальные цифры отбрасываются и конечные нули не отображаются

 

В приведенной ниже программе демонстрируется форматирование объектов типа TimeSpan на примере отображения времени, которое приблизительно требуется для вывода на экран 1000 целых значений в цикле for.

// Отформатировать объект типа TimeSpan.

Using System;

class TimeSpanDemo { static void Main() {

DateTime start = DateTime.Now;

// Вывести числа от 1 до 1000. for(int i = 1; i <= 1000; i++) {

Console.Write(i + " ");

if((i % 10) == 0) Console.WriteLine();

}

Console.WriteLine();

DateTime end = DateTime.Now;

TimeSpan span = end - start;

Console.WriteLine("Время выполнения: {0:c}", span);

Console.WriteLine("Время выполнения: {0:g}", span);

Console.WriteLine("Время выполнения: {0:G}", span);

Console.WriteLine("Время выполнения: 0.{0:fff} секунды", span);

}

}

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

981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 Время выполнения: 00:00:00.0140000 Время выполнения: 0:00:00.014 Время выполнения: 0:00:00:00.0140000 Время выполнения: 0.014 секунды

Форматирование перечислений

В C# допускается также форматировать значения, определяемые в перечислении. Вообще говоря, значения из перечисления могут отображаться как по имени, так и по значению. Спецификаторы формата перечислений сведены в табл. ”22.10. Обратите особое внимание на форматы G и F. Перед перечислениями, которые должны представлять битовые поля, следует указывать атрибут Flags. Как правило, в битовых полях хранятся значения, обозначающие отдельные двоичные разряды и упорядоченные по степени числа 2. При наличии атрибута Flags имена всех битовых составляющих форматируемого значения, если, конечно, это действительное значение, отображаются с помощью спецификатора G. А с помощью спецификатора F отображаются имена всех битовых составляющих форматируемого значения, если оно составляется путем логического сложения по ИЛИ двух или более полей, определяемых в перечислении.

Таблица 22.10. Спецификаторы формата перечислений Спецификатор Назначение

D Отображает значение в виде десятичного целого числа

d То же, что и D

F Отображает имя значения. Если это значение можно создать путем логиче

ского сложения по ИДИ двух или более полей, определенных в перечислении, то данный спецификатор отображает имена всех битовых составляющих заданного значения, причем независимо оттого, задан атрибут Flags или нет

f То же, что и F

G Отображает имя значения. Если перед форматируемым перечислением ука

зывается атрибут Flags, то данный спецификатор отображает имена всех битовых составляющих заданного значения, если, конечно, это допустимое значение g То же, что и G

X Отображает значение в виде шестнадцатеричного целого числа. Для отобра

жения как минимум восьми цифр форматируемое значение дополняется (при необходимости) начальными нулями х_То же, что и X_