netlib.narod.ru | < Назад | Оглавление | Далее > |
Одними из важнейших являются методы DateTime, представляющие дату и время в форме, удобной для восприятия человеком. Такое преобразование может казаться довольно простым, если забыть о том, что люди во всем мире записывают дату и время по-разному. В одних странах используется 24-часовая система измерения времени; в других — 12-часовая. Где-то пишут число до месяца, где-то — наоборот. Если в дате указывается название месяца или дня недели, хорошо бы указать их на местном языке. И даже в пределах одной страны пользователи могут настраивать отображение даты и времени по-своему.
Эти параметры, соответствующие государственным стандартам или личным предпочтениям пользователя, можно просмотреть и изменить в диалоговом окне Regional Options (Язык и стандарты) доступном из Панели управления. На вкладке General (Общие) можно задать местоположение компьютера, и дата и время будут отображаться согласно стандартам выбранной страны. На вкладках Time (Время) и Date (Дата) можно изменить стандартный формат отображения на собственный. Форматы отображения даты и времени, зависящие от конкретной страны или предпочтений пользователя, называются локализованными (culture-specific).
Выводить дату и время в формате, установленном пользователем, считается хорошим тоном, однако в ряде случаев это нежелательно. Иногда дата и время должны быть введены в документ, с которым будут работать в странах с другим форматом отображения подобной информации, или он будет объединен с другими документами. В таком случае в программе лучше использовать какой-то совместимый формат, соответствующий некоторым международным стандартам. В .NET Framework, для такого формата применяется термин регионально-независимый (culture-invariant).
В последующих примерах я буду использовать дату 1 июня 2002 г. и местное время 3:05:01 после полудня. Значения месяца, дня, часа, минуты и секунды специально выбраны состоящими из одной цифры, чтобы было ясно видно, происходит ли отбрасывание незначащих нулей при форматировании.
Допустим, dt — объект типа DateTime. Если вы просто передадите этот объект методу Console.WriteLine:
Console.WriteLine(dt);
или методу String.Format:
str = String.Format("{0}", dt);
он вызовет метод ToString объекта DateTime. Предыдущая инструкция эквивалентна такой:
str = dt.ToString();
Метод ToString преобразует дату и время в строку символов локализованного формата. Для установок «U.S. English», строка, возвращенная методом ToString, будет выглядеть так:
6/1/2002 3:05:01 PM
Структура DateTime также предоставляет несколько дополнительных версий метода ToString, которым передается один или два аргумента. Эти версии позволяют форматировать дату и время в локализованном или регионально-независимом формате:
Методы ToString структуры DateTime
string ToString() |
string ToString(string strFormat) |
string ToString(IFormatProvider ifp) |
string ToString(string strFormat, IFormatProvider ifp) |
Аргумент string — это обычно одна буква, определяющая стиль форматирования. Скоро я расскажу об этих буквах подробнее. Также аргумент string может содержать набор букв, задающих собственный формат.
Аргумент IFormatProvider определяет интерфейс. Для этого аргумента вам потребуется экземпляр класса, реализующего IFormatProvider. Один из таких классов — DateTimeFormatInfo из пространства имен System.Globalization. (Если вам нужна более подробная информация о классе DateTimeFormatInfo, чем та, которая представлена здесь, обратитесь к документации.) Класс DateTimeFormatInfo содержит два статических свойства, возвращающих экземпляры класса.
Статические свойства DateTimeFormatInfo
Тип | Свойство | Доступ |
DateTimeFormatInfo | CurrentInfo | Чтение |
DateTimeFormatInfo | InvariantInfo | Чтение |
Использовать регионально-независимое форматирование можно так:
strDT = dt.ToString(DateTimeFormatInfo.InvariantInfo);
или так:
strDT = dt.ToString(strFormat, DateTimeFormatInfo.InvariantInfo);
Применить форматирование, совместимое с локальными параметрами можно так:
strDT = dt.ToString(DateTimeFormatInfo.CurrentInfo);
или так:
strDT = dt.ToString(strFormat, DateTimeFormatInfo.CurrentInfo);
Кроме того, локализованное форматирование можно получить, указав в качестве второго аргумента метода ToString значение null:
strDT = dt.ToString(strFormat, null);
или используя strFormat в качестве единственного аргумента:
strDT = dt.ToString(strFormat);
Чтобы применить стандартные форматы даты и времени, следует передать методу ToString в качестве первого аргумента один из символов, перечисленных в приведенной ниже таблице. Во второй колонке показан формат, в котором будет представлена информация, если в качестве местоположения компьютера в Панели управления выбрать параметр «United States», а вторым аргументом метода ToString указать значение null или DateTimeFormatInfo.CurrentInfo либо использовать версию метода ToString с единственным аргументом. В правой колонке показан формат, который будет использован, если в качестве второго аргумента указать DateTimeFormatInfo.InvariantInfo. Этот формат не зависит от параметров, выставленных в Панели управления.
Форматы даты и времени метода ToString
Символ, обозначающий формат |
Аргумент, определяющий форматирование | |
CurrentInfo для США | InvariantInfo | |
d | 6/1/2002 | 06/01/2002 |
D | Saturday, June 01, 2002 | Saturday, 01 June 2002 |
f | Saturday, June 01, 2002 3:05 PM | Saturday, 01 June 2002 15:05 |
F | Saturday, June 01, 2002 3:05:01 PM | Saturday, 01 June 2002 15:05:01 |
g | 6/1/2002 3:05 PM | 06/01/2002 15:05 |
G или null | 6/1/2002 3:05:01 PM | 06/01/2002 15:05:01 |
m или M | June 01 | June 01 |
r или R | Sat, 01 June 2002 15:05:01 GMT | Так же, как для CurrentInfo |
s | 2002-06-01T15:05:01 | Так же, как для CurrentInfo |
t | 3:05 PM | 15:05 |
T | 3:05:01 PM | 15:05:01 |
u | 2002-06-01 15:05:01Z | Так же, как для CurrentInfo |
U | Saturday, June 01, 2002 7:05:01 PM | Saturday, 01 June 2002 19:05:01 |
y или Y | June, 2002 | 2002 June |
Символы, обозначающие формат, представляют собой первые буквы слов:
Мнемоника символов форматирования DateTime
Символ | Мнемоника |
d | Date (дата) |
f | Full (полный) |
g | General (общий) |
m | Month/day (месяц/день) |
r | RFC |
s | Sortable (для сортировки) |
t | Time (время) |
u | Universal (мировой) |
y | Year/month (год/месяц) |
Если строчная и прописная буквы обозначают разный формат (как, например, d и D), прописная буква обозначает более длинную строку. Для букв r, R, y и u формат возвращаемой строки не зависит от второго аргумента метода ToString.
Если не указать аргумент форматирования или указать значение null, метод возвращает строку, соответствующую локализованным правилам форматирования и указанию аргумента G (Общий). Таким образом, инструкция:
dt.ToString()
эквивалентна:
dt.ToString((string)null)
или:
dt.ToString((IFormatProvider)null)
или такому:
dt.ToString(null, null);
Все они возвращают строку, отформатированную в соответствии с локализованными правилами аргумента G. Такую же строку возвращают методы ToString с единственным аргументом IFormatProvider.
При использовании аргумента r или R метод ToString возвращает строку в формате RFC 1123 1. Строка, получаемая при использовании аргумента s, является строкой формата ISO 8601 2 и считается универсальной и простой для сортировки. Буква Т в центре этой строки называется указателем времени и разделяет дату и время. Даты, начинающиеся с месяца или числа, сортировать труднее чем в таком формате. Формат, обозначаемый аргументом u, похож на формат s, однако в нем нет указателя времени, а строка заканчивается буквой Z. В кругах военных и радистов Всемирное скоординированное время иногда называют время Зулу (Zulu time), буква Z обозначает время Зулу и нулевую долготу (от слова «zero» — ноль).
Аргумент U приводит к преобразованию времени во всемирное скоординированное. Подразумевается, что в объекте DateTime указано местное время.
Структура DateTime содержит четыре других довольно удобных метода для форматирования данных. Все они являются локализованными:
Методы DateTime (выборочно)
Метод | Возвращаемая строка (для параметров U.S. English) |
string ToShortDateString() | 6/1/2002 |
string ToLongDateString() | Saturday, June 01, 2002 |
string ToShortTimeString() | 3:05 PM |
string ToLongTimeString() | 3:05:01 PM |
Строки, возвращаемые этими методами, идентичны результатам применения аргументов d, D, t и Т, соответственно.
Давайте ради эксперимента в диалоговом окне Regional Options (Язык и стандарты) выберем в качестве местонахождения параметр Germany. Теперь сведения о дате и времени будут форматироваться, как показано в приведенной ниже таблице.
Форматы даты и времени метода ToString (для Германии)
Символ, обозначающий формат |
Аргумент, определяющий форматирование | |
CurrentInfo для Германии | InvariantInfo | |
d | 01.06.2002 | 06/01/2002 |
D | Samstag, 1. Juni 2002 | Saturday, 01 June 2002 |
f | Samstag, 1. Juni 2002 15:05 | Saturday, 01 June 2002 15:05 |
F | Samstag, 1. Juni 2002 15:05:01 | Saturday, 01 June 2002 15:05:01 |
g | 01.06.2002 15:05 | 06/01/2002 15:05 |
G или null | 01.06.2002 15:05:01 | 06/01/2002 15:05:01 |
m или M | 01 Juni | June 01 |
r или R | Sat, 01 June 2002 15:05:01 GMT | Так же, как для CurrentInfo |
s | 2002-06-01T15:05:01 | Так же, как для CurrentInfo |
t | 15:05 | 15:05 |
T | 15:05:01 | 15:05:01 |
u | 2002-06-01 15:05:01Z | Так же, как для CurrentInfo |
U | Samstag, 1. Juni 2002 19:05:01 | Saturday, 01 June 2002 19:05:01 |
y или Y | Juni 2002 | 2002 June |
Правая колонка не изменилась. В колонке с локализованными форматами используются немецкие названия месяцев и дней недели и внесены некоторые другие изменения.
Иногда метод ToString не просто форматирует строку. Если изменить параметр местоположения компьютера на одну из арабских стран, то в диалоговом окне Regional Options (Язык и стандарты) можно будет выбрать Григорианский или исламский календарь. Задав параметру расположения значение «Hebrew», вы сможете выбрать либо Григорианский, либо еврейский календарь. Если выбран еврейский или исламский календарь, то при выводе данных в локализованном формате дата будет преобразована автоматически.
1RFC расшифровывается как »Request For Comment» (запрос на комментарии) и означает способ распространения стандартов Интернета. Спецификация на отображение времени и даты в RFC 1123 — это несколько измененная версия спецификации RFC 822. Стандарты RFC доступны на многих Web-узлах, например http://www.ietf.org.
2Стандарт ISO 8601 («Date elements and interchange formats — Information interchange — Representation of dates and times») можно получить на Web-узле ISO по адресу http://www.iso.ch. Стандарт ISO 8601 определяет набор форматов отображения даты и времени. Формат, используемый методом ToString объекта DateTime, является первым из трех расширенных форматов, описанных в параграфе 5.4.1.а.
netlib.narod.ru | < Назад | Оглавление | Далее > |