Работа с C# DatetTime

0

Объект C# DateTime используется для работы с датами и временем в .NET. В этой статье я рассматриваю следующие темы DateTime с примерами кода C#:

  1. Как создать дату и время
  2. Общие сведения о свойствах DateTime
  3. Как добавить и вычесть дату и время с помощью DateTime
  4. Найдите дни в месяце и году
  5. Как сравнить две даты, время или DateTime
  6. Как форматировать дату и время

1. Как создать DateTime в C#

Существует несколько способов создания объекта DateTime. Объект DateTime может иметь дату, время, локализацию, культуру, миллисекунды и тип. Значение DateTime находится между 12:00:00 полуночи 1 января 0001 г. и 23:59:59 31 декабря 9999 г. н.э. Код в листинге 1 использует различные конструкторы структуры DateTime для создания объектов DateTime.

// Create a DateTime from date and time  
DateTime dob = new DateTime(1974, 7, 10, 7, 10, 24);  
   
// Create a DateTime from a String  
string dateString = "7/10/1974 7:10:24 AM";  
DateTime dateFromString =  
    DateTime.Parse(dateString, System.Globalization.CultureInfo.InvariantCulture);  
Console.WriteLine(dateFromString.ToString());  
   
// Empty DateTime  
DateTime emptyDateTime = new DateTime();  
   
// Just date  
DateTime justDate = new DateTime(2002, 10, 18);  
   
// DateTime from Ticks  
DateTime justTime = new DateTime(1000000);  
   
// DateTime with localization  
DateTime dateTimeWithKind = new DateTime(1974, 7, 10, 7, 10, 24, DateTimeKind.Local);  
   
// DateTime with date, time and milliseconds  
DateTime dateTimeWithMilliseconds = new DateTime(2010, 12, 15, 5, 30, 45, 100);  

2. Свойства даты и времени С#

Свойства Date и Time DateTime получают дату и время DateTime. Некоторые очевидные свойства DateTime: Hour, Minute, Second, Millisecond, Year, Month и Day. 

Вот список некоторых других свойств с их кратким описанием.

  • Свойство DayOfWeek возвращает название дня недели.
  • Свойство DayOfYear возвращает день года.
  • Свойство TimeOfDay возвращает элемент времени в DateTime.
  • Свойство Today возвращает объект DateTime с сегодняшними значениями. Значение времени 12:00:00.
  • Свойство Now возвращает объект DateTime, который имеет текущие значения даты и времени.
  • Свойство UtcNow возвращает DateTime в формате всемирного координированного времени (UTC).
  • Тик представляет собой сто наносекунд или одну десятимиллионную долю секунды. Свойство Ticks DateTime возвращает количество тиков в DateTime.
  • Свойство Kind возвращает значение, указывающее, основано ли время, представленное этим экземпляром, на местном времени, всемирном координированном времени (UTC) или ни на одном из них. Значение по умолчанию не указано.

Код, приведенный в листинге 2, создает объект DateTime и считывает его свойства. 

DateTime dob = new DateTime(1974, 7, 10, 7, 10, 24);  
Console.WriteLine("Day:{0}", dob.Day);  
Console.WriteLine("Month:{0}", dob.Month);  
Console.WriteLine("Year:{0}", dob.Year);  
Console.WriteLine("Hour:{0}", dob.Hour);  
Console.WriteLine("Minute:{0}", dob.Minute);  
Console.WriteLine("Second:{0}", dob.Second);  
Console.WriteLine("Millisecond:{0}", dob.Millisecond);  
   
Console.WriteLine("Day of Week:{0}", dob.DayOfWeek);  
Console.WriteLine("Day of Year: {0}", dob.DayOfYear);  
Console.WriteLine("Time of Day:{0}", dob.TimeOfDay);  
Console.WriteLine("Tick:{0}", dob.Ticks);  
Console.WriteLine("Kind:{0}", dob.Kind);  

Результат листинга 2 выглядит так же, как на рис. 1.

Рисунок 1

3. Добавление и вычитание DateTime в C#

Структура DateTime предоставляет методы для добавления и вычитания даты и времени из объекта DateTime. Структура TimeSpan играет важную роль в сложении и вычитании.

Мы можем использовать методы Add и Subtract для добавления и вычитания даты и времени из объекта DateTime. Сначала мы создаем TimeSpan со значениями даты и/или времени и используем методы Add и Subtract.

Код, приведенный в листинге 3, добавляет и вычитает 30 дней из сегодняшнего дня и отображает день на консоли. 

DateTime aDay = DateTime.Now;  
TimeSpan aMonth = new System.TimeSpan(30, 0, 0, 0);  
DateTime aDayAfterAMonth = aDay.Add(aMonth);  
DateTime aDayBeforeAMonth = aDay.Subtract(aMonth);  
Console.WriteLine("{0:dddd}", aDayAfterAMonth);  
Console.WriteLine("{0:dddd}", aDayBeforeAMonth);  

Структура DateTime имеет методы для добавления лет, дней, часов, минут, секунд, миллисекунд и тактов. Код, приведенный в листинге 4, использует эти методы Addxxx для добавления различных компонентов к объекту DateTime.

// Add Years and Days  
aDay.AddYears(2);            
aDay.AddDays(12);  
// Add Hours, Minutes, Seconds, Milliseconds, and Ticks  
aDay.AddHours(4.25);  
aDay.AddMinutes(15);  
aDay.AddSeconds(45);             
aDay.AddMilliseconds(200);  
aDay.AddTicks(5000);  

Структура DateTime не имеет подобных методов Subtract. Только метод Subtract используется для вычитания компонентов DateTime. Например, если нам нужно вычесть 12 дней из DateTime, мы можем создать другой объект DateTime или объект TimeSpan с 12 днями и вычесть его из DateTime. В качестве альтернативы мы можем использовать оператор минус, чтобы вычесть DateTime или TimeSpan из DateTime.

Фрагмент кода в листинге 5 создает объект DateTime и вычитает другой объект DateTime и TimeSpan. В коде также показано, как вычесть только дни, часы или другие компоненты из DateTime. 

DateTime dob = new DateTime(2000, 10, 20, 12, 15, 45);  
DateTime subDate = new DateTime(2000, 2, 6, 13, 5, 15);  
   
// TimeSpan with 10 days, 2 hrs, 30 mins, 45 seconds, and 100 milliseconds  
TimeSpan ts = new TimeSpan(10, 2, 30, 45, 100);  
   
// Subtract a DateTime  
TimeSpan diff1 = dob.Subtract(subDate);  
Console.WriteLine(diff1.ToString());  
   
// Subtract a TimeSpan  
DateTime diff2 = dob.Subtract(ts);  
Console.WriteLine(diff2.ToString());  
   
// Subtract 10 Days  
DateTime daysSubtracted = new DateTime(dob.Year, dob.Month, dob.Day - 10);  
Console.WriteLine(daysSubtracted.ToString());  
   
// Subtract hours, minutes, and seconds  
DateTime hms = new DateTime(dob.Year, dob.Month, dob.Day, dob.Hour - 1, dob.Minute - 15, dob.Second - 15);  
Console.WriteLine(hms.ToString());  

4. Найдите дни в месяце

Статический метод DaysInMonth возвращает количество дней в месяце. Этот метод принимает год и месяц в числах от 1 до 12. Фрагмент кода в листинге 6 получает количество дней в феврале месяца 2002 года. На выходе получается 28 дней.

int days = DateTime.DaysInMonth(2002, 2);  
Console.WriteLine(days);  

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

private int GetDaysInAYear(int year)  
{  
    int days = 0;  
    for (int i = 1; i <= 12; i++)  
    {  
        days += DateTime.DaysInMonth(year, i);  
    }  
    return days;  
}  

5. Сравните два DateTime в C#

Статический метод Compare используется для сравнения двух объектов DateTime. Если результат равен 0, оба объекта одинаковы. Если результат меньше 0, то первый DateTime более ранний; в противном случае первый DateTime будет позже.

Фрагмент кода в листинге 8 сравнивает два объекта DateTime.

DateTime firstDate = new DateTime(2002, 10, 22);  
DateTime secondDate = new DateTime(2009, 8, 11);  
int result = DateTime.Compare(firstDate, secondDate);  
   
if (result < 0)  
    Console.WriteLine("First date is earlier");  
else if (result == 0)  
    Console.WriteLine("Both dates are same");  
else  
    Console.WriteLine("First date is later");  

Метод CompareTo также можно использовать для сравнения двух дат. Этот метод принимает DateTime или объект. Фрагмент кода в листинге 9 сравнивает два объекта DateTime с помощью метода CompareTo. 

DateTime firstDate = new DateTime(2002, 10, 22);  
DateTime secondDate = new DateTime(2009, 8, 11);  
int compareResult = firstDate.CompareTo(secondDate);  
if (compareResult < 0)  
    Console.WriteLine("First date is earlier");  
else if (compareResult == 0)  
    Console.WriteLine("Both dates are same");  
else  
    Console.WriteLine("First date is later");  

6. Формат C# DateTime

Я должен признать; ребята из Microsoft проделали большую работу, предоставив решения для форматирования DateTime. Теперь вы можете отформатировать DateTime в любой строковый формат, который вы можете себе представить.

Метод GetDateTimeFormats возвращает все возможные форматы DateTime для текущего языка и региональных параметров компьютера. Фрагмент кода в листинге 10 возвращает массив строк всех возможных стандартных форматов.

DateTime dob = new DateTime(2002, 10, 22);  
string[] dateFormats = dob.GetDateTimeFormats();  
foreach (string format in dateFormats)  
    Console.WriteLine(format)  

Фрагмент кода в листинге 10 генерирует выходные данные, как на рис. 2.

Метод GetDateTimeFormats также имеет перегрузку, которая принимает спецификатор формата в качестве параметра и преобразует DateTime в этот формат. Очень важно понимать спецификаторы формата DateTime, чтобы получить желаемые форматы. Таблица 1 суммирует форматы и их коды.

CodePatternFormatSample
«d»Sort date  
«D»Long date  
«f»Full date time. Short time.  
«F»Full date time. Long time.  
«g»Generate date time. Short time.  
«G»General date time. Long time.  
«M», ‘m»Month/day.  
«O», «o»Round-trip date/time.  
«R», «r»RFC1123  
«s»Sortable date time.  
«t»Sort time.  
«T»Long time.  
«u»Universal sortable date time.  
«U»Universal full date time.  
«Y», «y»Year month.  
Таблица 1

 Фрагмент кода в листинге 11 использует некоторые спецификаторы формата DateTime.

DateTime dob = new DateTime(2002, 10, 22);  
// DateTime Formats: d, D, f, F, g, G, m, o, r, s, t, T, u, U,  
Console.WriteLine("----------------");  
Console.WriteLine("d Formats");  
Console.WriteLine("----------------");  
string[] dateFormats = dob.GetDateTimeFormats('d');  
foreach (string format in dateFormats)  
    Console.WriteLine(format);  
Console.WriteLine("----------------");  
Console.WriteLine("D Formats");  
Console.WriteLine("----------------");  
dateFormats = dob.GetDateTimeFormats('D');  
foreach (string format in dateFormats)  
    Console.WriteLine(format);  
   
Console.WriteLine("----------------");  
Console.WriteLine("f Formats");  
Console.WriteLine("----------------");  
dateFormats = dob.GetDateTimeFormats('f');  
foreach (string format in dateFormats)  
    Console.WriteLine(format);  
   
Console.WriteLine("----------------");  
Console.WriteLine("F Formats");  
Console.WriteLine("----------------");  
dateFormats = dob.GetDateTimeFormats('F');  
foreach (string format in dateFormats)  
    Console.WriteLine(format);  

Фрагмент кода в листинге 11 генерирует выходные данные, как на рис. 3.

Рисунок 3

Мы также можем отформатировать DateTime, передав спецификатор формата в метод ToString() класса DateTime. Фрагмент кода в листинге 12 форматирует DateTime с помощью метода ToString().

Console.WriteLine(dob.ToString("r"));

Фрагмент кода в листинге 13 использует некоторые спецификаторы формата DateTime в методе ToString() для форматирования DateTime. 

DateTime dob = new DateTime(2002, 10, 22);  
Console.WriteLine("d: "+ dob.ToString("d"));  
Console.WriteLine("D: "+ dob.ToString("D"));  
Console.WriteLine("f: "+ dob.ToString("f"));  
Console.WriteLine("F: "+ dob.ToString("F"));  
Console.WriteLine("g: " + dob.ToString("g"));  
Console.WriteLine("G: " + dob.ToString("G"));  
Console.WriteLine("m: " + dob.ToString("m"));  
Console.WriteLine("M: " + dob.ToString("M"));  
Console.WriteLine("o: " + dob.ToString("o"));  
Console.WriteLine("O: " + dob.ToString("O"));  
Console.WriteLine("r: " + dob.ToString("r"));  
Console.WriteLine("R: " + dob.ToString("R"));  
Console.WriteLine("s: " + dob.ToString("s"));  
Console.WriteLine("t: " + dob.ToString("t"));  
Console.WriteLine("T: " + dob.ToString("T"));  
Console.WriteLine("u: " + dob.ToString("u"));  
Console.WriteLine("U: " + dob.ToString("U"));  
Console.WriteLine("y: " + dob.ToString("y"));  
Console.WriteLine("Y: " + dob.ToString("Y"));  

Фрагмент кода в листинге 13 генерирует выходные данные, как на рис. 4. 

7. Получить високосный год и летнее время

Методы IsDayLightSavingTime() и IsLeapYear() можно использовать для определения того, является ли DateTime временем DayLightSaving и високосным годом соответственно. Фрагмент кода в листинге 14 показывает, как использовать эти методы. 

DateTime dob = new DateTime(2002, 10, 22);  
Console.WriteLine(dob.IsDaylightSavingTime());  
Console.WriteLine(DateTime.IsLeapYear(dob.Year));  

8. Как преобразовать строку в DateTime

Метод Parse используется для преобразования строки в объект DateTime. Строка, передаваемая методу Parse, должна иметь правильный формат DateTime. Преобразование DateTime в строку выполняется с помощью метода ToString().

Фрагмент кода в листинге 15 преобразует строку в DateTime.

string dt = "2010-10-04T20:12:45-5:00";  
DateTime newDt = DateTime.Parse(dt);  
Console.WriteLine(newDt.ToString());  

9. Как конвертировать C# DateTime

Структура DateTime полна не требующих пояснений методов преобразования, которые преобразуют DateTime в указанный тип. Это методы ToBinary, ToFileTime, ToLocalTime, ToLongDateString, ToLongTimeString, ToOADate, ToShortDateString, ToShortTimeString, ToString и ToUniversalTime.

Фрагмент кода в листинге 16 использует некоторые из этих методов для преобразования DateTime в указанные типы.

DateTime dob = new DateTime(2002, 10, 22);  
Console.WriteLine("ToString: " + dob.ToString());  
Console.WriteLine("ToBinary: " + dob.ToBinary());  
Console.WriteLine("ToFileTime: " + dob.ToFileTime());  
Console.WriteLine("ToLocalTime: " + dob.ToLocalTime());  
Console.WriteLine("ToLongDateString: " + dob.ToLongDateString());  
Console.WriteLine("ToLongTimeString: " + dob.ToLongTimeString());  
Console.WriteLine("ToOADate: " + dob.ToOADate());  
Console.WriteLine("ToShortDateString: " + dob.ToShortDateString());  
Console.WriteLine("ToShortTimeString: " + dob.ToShortTimeString());  
Console.WriteLine("ToUniversalTime: " + dob.ToUniversalTime());  

Фрагмент кода в листинге 11 генерирует вывод, похожий на рисунок 5.

Рисунок 5

10. Пример часового пояса C#

Вот пример кода на TimeZone (источник MSDN)

// Example of selected TimeZone class elements.   
using System;  
using System.Globalization;  
  
class TimeZoneDemo  
{  
    static void Main( )  
    {  
        const string dataFmt = "{0,-30}{1}";  
        const string timeFmt = "{0,-30}{1:yyyy-MM-dd HH:mm}";  
  
        Console.WriteLine(  
            "This example of selected TimeZone class " +  
            "elements generates the following \n" +  
            "output, which varies depending on the " +  
            "time zone in which it is run.\n" );  
  
        // Get the local time zone and the current local time and year.  
        TimeZone localZone = TimeZone.CurrentTimeZone;  
        DateTime currentDate = DateTime.Now;  
        int      currentYear = currentDate.Year;  
  
        // Display the names for standard time and daylight saving    
        // time for the local time zone.  
        Console.WriteLine( dataFmt, "Standard time name:",   
            localZone.StandardName );  
        Console.WriteLine( dataFmt, "Daylight saving time name:",   
            localZone.DaylightName );  
  
        // Display the current date and time and show if they occur    
        // in daylight saving time.  
        Console.WriteLine( "\n" + timeFmt, "Current date and time:",  
            currentDate );  
        Console.WriteLine( dataFmt, "Daylight saving time?",   
            localZone.IsDaylightSavingTime( currentDate ) );  
  
        // Get the current Coordinated Universal Time (UTC) and UTC    
        // offset.  
        DateTime currentUTC =   
            localZone.ToUniversalTime( currentDate );  
        TimeSpan currentOffset =   
            localZone.GetUtcOffset( currentDate );  
  
        Console.WriteLine( timeFmt, "Coordinated Universal Time:",   
            currentUTC );  
        Console.WriteLine( dataFmt, "UTC offset:", currentOffset );  
  
        // Get the DaylightTime object for the current year.  
        DaylightTime daylight =   
            localZone.GetDaylightChanges( currentYear );  
  
        // Display the daylight saving time range for the current year.  
        Console.WriteLine(   
            "\nDaylight saving time for year {0}:", currentYear );  
        Console.WriteLine( "{0:yyyy-MM-dd HH:mm} to " +  
            "{1:yyyy-MM-dd HH:mm}, delta: {2}",   
            daylight.Start, daylight.End, daylight.Delta );  
    }   
}

Резюме

Структура C# DateTime используется для представления и работы с датами и временем в .NET. В этой главе я продемонстрировал, как создать объект DateTime и использовать его в своем приложении. Я также обсудил различные свойства DateTime и то, как складывать и вычитать дату и время. После этого я обсудил, как сравнивать, форматировать и преобразовывать дату и время. 

0
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии
Авторизация
*
*
Регистрация
*
*
*
Пароль не введен
*
Генерация пароля
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x
()
x