TOC

This article has been localized into Russian by the community.

Введение:

Работа с датой и временем

В C# есть отличная структура для работы с датами и временем - она называется DateTime. На самом деле это не тип данных, но я включил его в эту главу, потому что вы часто будете работать с датами и/или временем, используя структуру DateTime - иногда так же, как вы работаете со строками и числами.

Начнем, создав новый объект datetime:

DateTime dt = new DateTime();
Console.WriteLine(dt.ToString());

Результат получился довольно скучным: 01-01-0001 00:00:00. Он соответствует значению поля DateTime.MinValue. Структура DateTime содержит и более полезные свойства - самым интересным является DateTime.Now:

DateTime dt = DateTime.Now;
Console.WriteLine(dt.ToString());

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

DateTime dt = new DateTime(2042, 12, 24);
Console.WriteLine(dt.ToString());

Порядок параметров в этом конструкторе-Год, месяц, день, поэтому это даст нам объект DateTime с датой, представляющей канун Рождества в 2042 году.

DateTime - с или без времени?

Но что насчет времени? Ну, если Вы не укажите один, он будет по умолчанию 00:00:00, Как вы можете видеть из нашего предыдущего примера. Вы можете легко указать также время, хотя:

DateTime dt = new DateTime(2042, 12, 24, 18, 42, 0);
Console.WriteLine(dt.ToString());

Теперь объект типа DateTime имеет время, в данном случае это 18:42. Обратите внимание, что часы должны быть указаны как число от 0 до 23, так как мы используем 24-часовой формат для ввода, но не волнуйтесь, если вы хотите использовать 12-часовой формат с AM/PM - это легко сделать в выводе. Это мы обсудим позже.

Остался вопрос: Что делать, если вас интересует только часть даты? Очевидным ответом было бы использование класса Date вместо класса DateTime, но на самом деле такой вещи не существует. Вместо этого класс DateTime имеет свойство Date:

DateTime dt = new DateTime(2042, 12, 24, 18, 42, 0);
DateTime date = dt.Date;
Console.WriteLine(date.ToString());

Как вы видите, однако, свойство Date также является объектом DateTime, где часть со временем была установлена в 00:00:00. Это может быть немного запутанным, но это также имеет довольно хороший смысл, потому что DateTime всегда должен служить просто контейнером, содержащим данные, которые вы можете выводить пользователю во многих отношениях и формах. Мы уже использовали базовый метод ToString(), но есть еще много способов получить выходные данные объекта DateTime.

Вывод DateTime

Получение выходных данных DateTime является одним из наиболее важных аспектов, но это также может быть сложной задачей - это действительно зависит от ваших потребностей. До сих пор мы видели очень простую версию вывода: простой вызов метода ToString (). Он выведет дату и время на основе текущего языка и региональных параметров приложения, которые по умолчанию основаны на системных параметрах. Это означает, что если вы просто вызываете метод tostring (), дата и время будут представлены Пользователю в понятном для них независимо от того, где в мире они находятся, потому что, как вы, наверное, знаете, Формат времени и даты особенно сильно варьируется от региона к региону.

Если вы хотите получить больше контроля над выводом, есть несколько способов сделать это. Самый быстрый способ - использовать один из методов To*, например метод ToShortDateString:

Console.WriteLine(DateTime.Now.ToShortDateString());

Это выведет короткую версию даты, полностью опуская часть времени. Можно также использовать метод ToLongDateString:

Console.WriteLine(DateTime.Now.ToLongDateString());

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

Если вы хотите получить больше контроля, возможно, потому, что вы хотите адаптировать свою информацию о дате / времени к определенному региону, вы можете использовать одну из перегрузок метода ToString (), например, указав точно, на какой язык / регион вы ориентируетесь:

var usCulture = new System.Globalization.CultureInfo("en-US");
Console.WriteLine(DateTime.Now.ToString(usCulture.DateTimeFormat));

Класс CultureInfo позволяет получить полный блок информации о языке, например, о том, как они пишут даты и время (класс CultureInfo будет рассмотрен далее в этом учебнике). Затем мы можем передать эту информацию классу DateTime, чтобы он знал, что мы хотим, чтобы визуальное представление даты и времени соответствовало этому языку. Но что, если мы хотим быть еще более конкретными о выходе?

Стандартные Строки Формата Даты & Времени

Чтобы получить еще больший контроль над выводом, можно использовать стандартные строки формата даты и времени, предоставляемые платформой .NET framework. Это одна буква, используемая для отображения даты и / или времени. Для полного списка я предлагаю вам взглянуть на documentationно пока, вот несколько примеров:

DateTime dt = new DateTime(2042, 12, 24, 18, 42, 0);  

Console.WriteLine("Short date pattern (d): " + dt.ToString("d"));  
Console.WriteLine("Long date pattern (D): " + dt.ToString("D"));  
Console.WriteLine("Full date/time pattern (F): " + dt.ToString("F"));  
Console.WriteLine("Year/month pattern (y): " + dt.ToString("y"));

Вывод будет таким:

Short date pattern (d):         24-12-2042
Long date pattern (D):  24. december 2042
Full date/time pattern (F):     24. december 2042 18:42:00
Year/month pattern (y): december 2042

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

Пользовательские строки формата Date & Time

Для полного контроля у нас есть строки пользовательского формата. Они представляют собой комбинацию букв и специальных символов, которые вы передаете методу ToString (), чтобы показать формат exact, который вы хотите для своей даты и/или времени - это включает в себя, где вы хотите части даты / времени, как вы хотите их и какие разделители вы хотели бы использовать. Очевидно, что это оставляет вас с большим количеством опций, поэтому для полный список спецификаторов формата, пожалуйста, проверьте documentation, но давайте посмотрим, как это работает прямо сейчас:

DateTime dt = new DateTime(2042, 12, 24, 18, 42, 0);

Console.WriteLine(dt.ToString("MM'/'dd yyyy"));
Console.WriteLine(dt.ToString("dd.MM.yyyy"));
Console.WriteLine(dt.ToString("MM.dd.yyyy HH:mm"));
Console.WriteLine(dt.ToString("dddd, MMMM (yyyy): HH:mm:ss"));
Console.WriteLine(dt.ToString("dddd @ hh:mm tt", System.Globalization.CultureInfo.InvariantCulture));

Вывод будет подобен этому:

12/24 2042
24.12.2042
12.24.2042 18:42
onsdag, december (2042): 18:42:00
Wednesday @ 06:42 PM

В общем, один или несколько dбудет вам какой-то вариант дня, одного или нескольких M'sдаст вам месяц (строчные mдля минут) и число для y'sдаст вам год. Чтобы полностью понять, что делают эти спецификаторы формата, я все же предлагаю вам взглянуть на documentation, но, надеюсь, приведенный выше пример дал вам хорошее представление о том, насколько мощны строки пользовательского формата.

Разбирая даты

До сих пор мы работали с датами, определенными непосредственно в коде, но вы, вероятно, быстро столкнетесь с ситуацией, когда вам нужно работать с датой, указанной пользователем. Это удивительно сложная тема, потому что есть так много способов написания даты. Платформа .NET framework может помочь вам в этом, поскольку она поддерживает все культуры, как показано в предыдущих примерах, но вам все равно нужно помочь пользователю указать дату в ожидаемом формате. После этого можно использовать метод Parse() для преобразования указанной пользователем строки в объект DateTime, например:

var usCulture = new System.Globalization.CultureInfo("en-US");
Console.WriteLine("Please specify a date. Format: " + usCulture.DateTimeFormat.ShortDatePattern);
string dateString = Console.ReadLine();
DateTime userDate = DateTime.Parse(dateString, usCulture.DateTimeFormat);
Console.WriteLine("Date entered (long date format):" + userDate.ToLongDateString());

Этот пример на самом деле довольно крут, потому что он показывает, насколько .NET framework может нам помочь, если у нас есть экземпляр класса CultureInfo, который мы хотим использовать (в данном случае английский язык США - и не волнуйтесь, мы обсудим класс CultureInfo более подробно позже). Как только у нас есть это, мы используем его для того, чтобы пользователь знал, какой формат мы ожидаем. Затем мы используем его снова в 4-й строке, чтобы фактически разобрать ввод. В последней строке выведем указанную пользователем дату, на этот раз просто используя Формат, заданный системой.

Однако имейте в виду, что метод Parse() очень строг - если пользователь не введет дату в ожидаемом формате, он выдаст исключение. По этой причине обычно рекомендуется использовать вместо этого метод TryParse() - он делает то же самое, но это позволяет проверить, может ли быть обработана Дата или нет, и это не исключение. Вот пересмотренная версия предыдущего примера:

var usCulture = new System.Globalization.CultureInfo("en-US");
Console.WriteLine("Please specify a date. Format: " + usCulture.DateTimeFormat.ShortDatePattern);
string dateString = Console.ReadLine();
DateTime userDate;
if (DateTime.TryParse(dateString, usCulture.DateTimeFormat, System.Globalization.DateTimeStyles.None, out userDate))
    Console.WriteLine("Valid date entered (long date format):" + userDate.ToLongDateString());
else
    Console.WriteLine("Invalid date specified!");

Резюме

Работа с датами и временем очень важна, но и очень сложна. К счастью для нас, .NET framework помогает нам практически во всех ситуациях с блестящим классом DateTime.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!