Использование структур DateOnly и TimeOnly
Структуры DateOnly и TimeOnly были представлены с .NET 6 и представляют определенную дату или время в день соответственно. До .NET 6 и всегда в .NET Framework разработчики использовали тип DateTime (или другую альтернативу) для представления одного из следующих вариантов:
- Полная дата и время.
- Дата, игнорирующая время.
- Время, игнорирующее дату.
DateOnly
и TimeOnly
— это типы, представляющие эти определенные части типа DateTime
.
Структура DateOnly
Структура DateOnly представляет определенную дату без времени. Поскольку он не имеет компонента времени, он представляет дату с начала дня до конца дня. Эта структура идеально подходит для хранения конкретных дат, таких как дата рождения, дата годовщины или даты, связанные с бизнесом.
Хотя вы можете использовать DateTime
, игнорируя компонент времени, существует несколько преимуществ использования DateOnly
более DateTime
:
Структура
DateTime
может перемещаться на предыдущий или следующий день, если она смещена из-за часового пояса.DateOnly
не может быть скорректирован с помощью часового пояса и всегда представляет установленную дату.Сериализация структуры
DateTime
включает компонент времени, который может затруднить понимание назначения данных. Кроме того,DateOnly
сериализует меньше данных.При взаимодействии кода с базой данных, например SQL Server, все даты обычно хранятся как тип данных
date
, который не включает время.DateOnly
лучше соответствует типу базы данных.
DateOnly
имеет диапазон от 0001-01-01 до 9999-12-31, как и DateTime
. В конструкторе DateOnly
можно указать определенный календарь. Однако объект DateOnly
всегда представляет дату в пролептическом григорианском календаре, независимо от того, какой календарь использовался для его создания. Например, можно создать дату из еврейского календаря, но дата преобразуется в григорианский:
var hebrewCalendar = new System.Globalization.HebrewCalendar();
var theDate = new DateOnly(5776, 2, 8, hebrewCalendar); // 8 Cheshvan 5776
Console.WriteLine(theDate);
/* This example produces the following output:
*
* 10/21/2015
*/
Dim hebrewCalendar = New System.Globalization.HebrewCalendar()
Dim theDate = New DateOnly(5776, 2, 8, hebrewCalendar) ' 8 Cheshvan 5776
Console.WriteLine(theDate)
' This example produces the following output
'
' 10/21/2015
Примеры DateOnly
Используйте следующие примеры, чтобы узнать о DateOnly
:
- преобразование DateTime в DateOnly
- Добавить или вычитать дни, месяцы, годы
- Синтаксический анализ и форматирование DateOnly
- сравнить DateOnly
Преобразование DateTime в DateOnly
Используйте статический метод DateOnly.FromDateTime для создания типа DateOnly
из типа DateTime
, как показано в следующем коде:
var today = DateOnly.FromDateTime(DateTime.Now);
Console.WriteLine($"Today is {today}");
/* This example produces output similar to the following:
*
* Today is 12/28/2022
*/
Dim today = DateOnly.FromDateTime(DateTime.Now)
Console.WriteLine($"Today is {today}")
' This example produces output similar to the following
'
' Today is 12/28/2022
Добавление или вычитание дней, месяцев, лет
Существует три метода для настройки структуры DateOnly: AddDays, AddMonthsи AddYears. Каждый метод принимает целочисленный параметр и увеличивает дату на это измерение. Если указано отрицательное число, дата уменьшается на это измерение. Методы возвращают новый экземпляр DateOnly
, так как структура неизменяема.
var theDate = new DateOnly(2015, 10, 21);
var nextDay = theDate.AddDays(1);
var previousDay = theDate.AddDays(-1);
var decadeLater = theDate.AddYears(10);
var lastMonth = theDate.AddMonths(-1);
Console.WriteLine($"Date: {theDate}");
Console.WriteLine($" Next day: {nextDay}");
Console.WriteLine($" Previous day: {previousDay}");
Console.WriteLine($" Decade later: {decadeLater}");
Console.WriteLine($" Last month: {lastMonth}");
/* This example produces the following output:
*
* Date: 10/21/2015
* Next day: 10/22/2015
* Previous day: 10/20/2015
* Decade later: 10/21/2025
* Last month: 9/21/2015
*/
Dim theDate = New DateOnly(2015, 10, 21)
Dim nextDay = theDate.AddDays(1)
Dim previousDay = theDate.AddDays(-1)
Dim decadeLater = theDate.AddYears(10)
Dim lastMonth = theDate.AddMonths(-1)
Console.WriteLine($"Date: {theDate}")
Console.WriteLine($" Next day: {nextDay}")
Console.WriteLine($" Previous day: {previousDay}")
Console.WriteLine($" Decade later: {decadeLater}")
Console.WriteLine($" Last month: {lastMonth}")
' This example produces the following output
'
' Date: 10/21/2015
' Next day: 10/22/2015
' Previous day: 10/20/2015
' Decade later: 10/21/2025
' Last month: 9/21/2015
Разбор и форматирование DateOnly
DateOnly можно проанализировать из строки, как и структура DateTime. Все стандартные маркеры синтаксического анализа дат .NET работают с DateOnly
. При преобразовании типа DateOnly
в строку можно использовать стандартные шаблоны форматирования на основе дат .NET. Дополнительные сведения о форматировании строк см. в строках формата даты и времени уровня "Стандартный".
var theDate = DateOnly.ParseExact("21 Oct 2015", "dd MMM yyyy", CultureInfo.InvariantCulture); // Custom format
var theDate2 = DateOnly.Parse("October 21, 2015", CultureInfo.InvariantCulture);
Console.WriteLine(theDate.ToString("m", CultureInfo.InvariantCulture)); // Month day pattern
Console.WriteLine(theDate2.ToString("o", CultureInfo.InvariantCulture)); // ISO 8601 format
Console.WriteLine(theDate2.ToLongDateString());
/* This example produces the following output:
*
* October 21
* 2015-10-21
* Wednesday, October 21, 2015
*/
Dim theDate = DateOnly.ParseExact("21 Oct 2015", "dd MMM yyyy", CultureInfo.InvariantCulture) ' Custom format
Dim theDate2 = DateOnly.Parse("October 21, 2015", CultureInfo.InvariantCulture)
Console.WriteLine(theDate.ToString("m", CultureInfo.InvariantCulture)) ' Month day pattern
Console.WriteLine(theDate2.ToString("o", CultureInfo.InvariantCulture)) ' ISO 8601 format
Console.WriteLine(theDate2.ToLongDateString())
' This example produces the following output
'
' October 21
' 2015-10-21
' Wednesday, October 21, 2015
Сравнение DateOnly
DateOnly можно сравнить с другими экземплярами. Например, можно проверить, является ли дата до или после другой, или если дата сегодня соответствует определенной дате.
var theDate = DateOnly.ParseExact("21 Oct 2015", "dd MMM yyyy", CultureInfo.InvariantCulture); // Custom format
var theDate2 = DateOnly.Parse("October 21, 2015", CultureInfo.InvariantCulture);
var dateLater = theDate.AddMonths(6);
var dateBefore = theDate.AddDays(-10);
Console.WriteLine($"Consider {theDate}...");
Console.WriteLine($" Is '{nameof(theDate2)}' equal? {theDate == theDate2}");
Console.WriteLine($" Is {dateLater} after? {dateLater > theDate} ");
Console.WriteLine($" Is {dateLater} before? {dateLater < theDate} ");
Console.WriteLine($" Is {dateBefore} after? {dateBefore > theDate} ");
Console.WriteLine($" Is {dateBefore} before? {dateBefore < theDate} ");
/* This example produces the following output:
*
* Consider 10/21/2015
* Is 'theDate2' equal? True
* Is 4/21/2016 after? True
* Is 4/21/2016 before? False
* Is 10/11/2015 after? False
* Is 10/11/2015 before? True
*/
Dim theDate = DateOnly.ParseExact("21 Oct 2015", "dd MMM yyyy", CultureInfo.InvariantCulture) ' Custom format
Dim theDate2 = DateOnly.Parse("October 21, 2015", CultureInfo.InvariantCulture)
Dim dateLater = theDate.AddMonths(6)
Dim dateBefore = theDate.AddDays(-10)
Console.WriteLine($"Consider {theDate}...")
Console.WriteLine($" Is '{NameOf(theDate2)}' equal? {theDate = theDate2}")
Console.WriteLine($" Is {dateLater} after? {dateLater > theDate} ")
Console.WriteLine($" Is {dateLater} before? {dateLater < theDate} ")
Console.WriteLine($" Is {dateBefore} after? {dateBefore > theDate} ")
Console.WriteLine($" Is {dateBefore} before? {dateBefore < theDate} ")
' This example produces the following output
'
' Consider 10/21/2015
' Is 'theDate2' equal? True
' Is 4/21/2016 after? True
' Is 4/21/2016 before? False
' Is 10/11/2015 after? False
' Is 10/11/2015 before? True
Структура TimeOnly
Структура TimeOnly представляет собой значение времени дня, например ежедневный будильник или время, когда вы обедаете каждый день.
TimeOnly
ограничен диапазоном 00:00:00,0000000 - 23:59:59.9999999, определенное время дня.
До введения TimeOnly
типа программисты обычно используют тип DateTime или тип TimeSpan для представления определенного времени. Однако использование этих структур для имитации времени без даты может привести к некоторым проблемам, которые TimeOnly
решает:
TimeSpan
представляет истекшее время, например время, измеряемое с помощью стоп-часов. Верхний предел превышает 29 000 лет, и его значение может быть отрицательным, чтобы указать на перемещение назад во времени. ОтрицательныйTimeSpan
не указывает определенное время дня.Если
TimeSpan
используется в качестве времени дня, существует риск того, что его значение может быть изменено за пределы 24-часового дня.TimeOnly
не имеет этого риска. Например, если смена работы сотрудника начинается в 18:00 и длится 8 часов, добавив 8 часов в структуруTimeOnly
обновляется на 2:00.Использование
DateTime
с указанием времени суток требует, чтобы с временем была связана произвольная дата, которая затем игнорируется. Обычно рекомендуется выбратьDateTime.MinValue
(0001-01-01) в качестве даты, однако если часы вычитаются из значенияDateTime
, может возникнуть исключениеOutOfRange
.TimeOnly
не имеет этой проблемы, так как время перемещается вперед и назад в пределах 24-часового временного интервала.Сериализация структуры
DateTime
включает компонент даты, который может скрыть намерение данных. Кроме того,TimeOnly
сериализует меньше данных.
Примеры TimeOnly
Используйте следующие примеры, чтобы узнать о TimeOnly
:
- Преобразовать DateTime в TimeOnly
- Добавить или вычитать время
- синтаксический анализ и форматирование TimeOnly
- Работа с TimeSpan и DateTime
- Арифметические операторы и сравнение с TimeOnly
Преобразование DateTime в TimeOnly
Используйте статический метод TimeOnly.FromDateTime для создания типа TimeOnly
из типа DateTime
, как показано в следующем коде:
var now = TimeOnly.FromDateTime(DateTime.Now);
Console.WriteLine($"It is {now} right now");
/* This example produces output similar to the following:
*
* It is 2:01 PM right now
*/
Dim now = TimeOnly.FromDateTime(DateTime.Now)
Console.WriteLine($"It is {now} right now")
' This example produces output similar to the following
'
' It is 2:01 PM right now
Добавление или вычитание времени
Существует три метода для настройки структуры TimeOnly: AddHours, AddMinutesи Add. Оба AddHours
и AddMinutes
принимают целочисленный параметр и настраивают значение соответствующим образом. Вы можете использовать отрицательное значение для вычитания и положительного значения для добавления. Методы возвращают новый экземпляр TimeOnly
, так как структура неизменяема. Метод Add
принимает параметр TimeSpan и добавляет или вычитает значение из значения TimeOnly
.
Так как TimeOnly
представляет только 24-часовой период, он переключается вперед или назад при добавлении значений, предоставленных этим трем методам. Например, если вы используете значение 01:30:00
для представления 1:30 утра, затем добавьте -4 часов начиная с этого момента, и оно перемещается назад к 21:30:00
, что составляет 9:30 вечера. Существуют перегрузки методов для AddHours
, AddMinutes
и Add
, которые фиксируют количество переносимых дней.
var theTime = new TimeOnly(7, 23, 11);
var hourLater = theTime.AddHours(1);
var minutesBefore = theTime.AddMinutes(-12);
var secondsAfter = theTime.Add(TimeSpan.FromSeconds(10));
var daysLater = theTime.Add(new TimeSpan(hours: 21, minutes: 200, seconds: 83), out int wrappedDays);
var daysBehind = theTime.AddHours(-222, out int wrappedDaysFromHours);
Console.WriteLine($"Time: {theTime}");
Console.WriteLine($" Hours later: {hourLater}");
Console.WriteLine($" Minutes before: {minutesBefore}");
Console.WriteLine($" Seconds after: {secondsAfter}");
Console.WriteLine($" {daysLater} is the time, which is {wrappedDays} days later");
Console.WriteLine($" {daysBehind} is the time, which is {wrappedDaysFromHours} days prior");
/* This example produces the following output:
*
* Time: 7:23 AM
* Hours later: 8:23 AM
* Minutes before: 7:11 AM
* Seconds after: 7:23 AM
* 7:44 AM is the time, which is 1 days later
* 1:23 AM is the time, which is -9 days prior
*/
Dim wrappedDays As Integer
Dim wrappedDaysFromHours As Integer
Dim theTime = New TimeOnly(7, 23, 11)
Dim hourLater = theTime.AddHours(1)
Dim minutesBefore = theTime.AddMinutes(-12)
Dim secondsAfter = theTime.Add(TimeSpan.FromSeconds(10))
Dim daysLater = theTime.Add(New TimeSpan(hours:=21, minutes:=200, seconds:=83), wrappedDays)
Dim daysBehind = theTime.AddHours(-222, wrappedDaysFromHours)
Console.WriteLine($"Time: {theTime}")
Console.WriteLine($" Hours later: {hourLater}")
Console.WriteLine($" Minutes before: {minutesBefore}")
Console.WriteLine($" Seconds after: {secondsAfter}")
Console.WriteLine($" {daysLater} is the time, which is {wrappedDays} days later")
Console.WriteLine($" {daysBehind} is the time, which is {wrappedDaysFromHours} days prior")
' This example produces the following output
'
' Time: 7:23 AM
' Hours later: 8:23 AM
' Minutes before: 7:11 AM
' Seconds after: 7:23 AM
' 7:44 AM is the time, which is 1 days later
' 1:23 AM is the time, which is -9 days prior
Анализ и форматирование TimeOnly
TimeOnly можно проанализировать из строки, как и структура DateTime. Все стандартные временные токены синтаксического анализа .NET работают с TimeOnly
. При преобразовании типа TimeOnly
в строку можно использовать стандартные шаблоны форматирования на основе дат .NET. Дополнительные сведения о форматировании строк см. в строках формата даты и времени уровня "Стандартный".
var theTime = TimeOnly.ParseExact("5:00 pm", "h:mm tt", CultureInfo.InvariantCulture); // Custom format
var theTime2 = TimeOnly.Parse("17:30:25", CultureInfo.InvariantCulture);
Console.WriteLine(theTime.ToString("o", CultureInfo.InvariantCulture)); // Round-trip pattern.
Console.WriteLine(theTime2.ToString("t", CultureInfo.InvariantCulture)); // Long time format
Console.WriteLine(theTime2.ToLongTimeString());
/* This example produces the following output:
*
* 17:00:00.0000000
* 17:30
* 5:30:25 PM
*/
Dim theTime = TimeOnly.ParseExact("5:00 pm", "h:mm tt", CultureInfo.InvariantCulture) ' Custom format
Dim theTime2 = TimeOnly.Parse("17:30:25", CultureInfo.InvariantCulture)
Console.WriteLine(theTime.ToString("o", CultureInfo.InvariantCulture)) ' Round-trip pattern.
Console.WriteLine(theTime2.ToString("t", CultureInfo.InvariantCulture)) ' Long time format
Console.WriteLine(theTime2.ToLongTimeString())
' This example produces the following output
'
' 17:00:00.0000000
' 17:30
' 5:30:25 PM
Сериализация типов DateOnly и TimeOnly
В .NET 7+ System.Text.Json
поддерживает сериализацию и десериализацию типов DateOnly и TimeOnly. Рассмотрим следующий объект:
sealed file record Appointment(
Guid Id,
string Description,
DateOnly Date,
TimeOnly StartTime,
TimeOnly EndTime);
Public NotInheritable Class Appointment
Public Property Id As Guid
Public Property Description As String
Public Property DateValue As DateOnly?
Public Property StartTime As TimeOnly?
Public Property EndTime As TimeOnly?
End Class
В следующем примере сериализуется объект Appointment
, отображается полученный JSON, а затем десериализуется обратно в новый экземпляр типа Appointment
. Наконец, исходные и недавно десериализированные экземпляры сравниваются для равенства, а результаты записываются в консоль:
Appointment originalAppointment = new(
Id: Guid.NewGuid(),
Description: "Take dog to veterinarian.",
Date: new DateOnly(2002, 1, 13),
StartTime: new TimeOnly(5,15),
EndTime: new TimeOnly(5, 45));
string serialized = JsonSerializer.Serialize(originalAppointment);
Console.WriteLine($"Resulting JSON: {serialized}");
Appointment deserializedAppointment =
JsonSerializer.Deserialize<Appointment>(serialized)!;
bool valuesAreTheSame = originalAppointment == deserializedAppointment;
Console.WriteLine($"""
Original record has the same values as the deserialized record: {valuesAreTheSame}
""");
Dim originalAppointment As New Appointment With {
.Id = Guid.NewGuid(),
.Description = "Take dog to veterinarian.",
.DateValue = New DateOnly(2002, 1, 13),
.StartTime = New TimeOnly(5, 3, 1),
.EndTime = New TimeOnly(5, 3, 1)
}
Dim serialized As String = JsonSerializer.Serialize(originalAppointment)
Console.WriteLine($"Resulting JSON: {serialized}")
Dim deserializedAppointment As Appointment =
JsonSerializer.Deserialize(Of Appointment)(serialized)
Dim valuesAreTheSame As Boolean =
(originalAppointment.DateValue = deserializedAppointment.DateValue AndAlso
originalAppointment.StartTime = deserializedAppointment.StartTime AndAlso
originalAppointment.EndTime = deserializedAppointment.EndTime AndAlso
originalAppointment.Id = deserializedAppointment.Id AndAlso
originalAppointment.Description = deserializedAppointment.Description)
Console.WriteLine(
$"Original object has the same values as the deserialized object: {valuesAreTheSame}")
В приведенном выше коде:
- Объект
Appointment
создается и назначается переменнойappointment
. - Экземпляр
appointment
сериализуется в JSON с помощью JsonSerializer.Serialize. - Результирующий json записывается в консоль.
- JSON десериализирован обратно в новый экземпляр типа
Appointment
с помощью JsonSerializer.Deserialize. - Исходные и недавно десериализированные экземпляры сравниваются на равенство.
- Результат сравнения записывается в консоль.
Дополнительные сведения см. в статье Сериализация и десериализация JSON в.NET.
Работа с TimeSpan и DateTime
TimeOnly можно создать и преобразовать в TimeSpan. Кроме того, TimeOnly
можно использовать с DateTimeлибо для создания экземпляра TimeOnly
, либо для создания экземпляра DateTime
, если дата предоставлена.
В следующем примере создается объект TimeOnly
из TimeSpan
, а затем преобразует его обратно:
// TimeSpan must in the range of 00:00:00.0000000 to 23:59:59.9999999
var theTime = TimeOnly.FromTimeSpan(new TimeSpan(23, 59, 59));
var theTimeSpan = theTime.ToTimeSpan();
Console.WriteLine($"Variable '{nameof(theTime)}' is {theTime}");
Console.WriteLine($"Variable '{nameof(theTimeSpan)}' is {theTimeSpan}");
/* This example produces the following output:
*
* Variable 'theTime' is 11:59 PM
* Variable 'theTimeSpan' is 23:59:59
*/
' TimeSpan must in the range of 00:00:00.0000000 to 23:59:59.9999999
Dim theTime = TimeOnly.FromTimeSpan(New TimeSpan(23, 59, 59))
Dim theTimeSpan = theTime.ToTimeSpan()
Console.WriteLine($"Variable '{NameOf(theTime)}' is {theTime}")
Console.WriteLine($"Variable '{NameOf(theTimeSpan)}' is {theTimeSpan}")
' This example produces the following output
'
' Variable 'theTime' is 11:59 PM
' Variable 'theTimeSpan' is 23:59:59
В следующем примере создается DateTime
из объекта TimeOnly
с выбранной произвольной датой:
var theTime = new TimeOnly(11, 25, 46); // 11:25 AM and 46 seconds
var theDate = new DateOnly(2015, 10, 21); // October 21, 2015
var theDateTime = theDate.ToDateTime(theTime);
var reverseTime = TimeOnly.FromDateTime(theDateTime);
Console.WriteLine($"Date only is {theDate}");
Console.WriteLine($"Time only is {theTime}");
Console.WriteLine();
Console.WriteLine($"Combined to a DateTime type, the value is {theDateTime}");
Console.WriteLine($"Converted back from DateTime, the time is {reverseTime}");
/* This example produces the following output:
*
* Date only is 10/21/2015
* Time only is 11:25 AM
*
* Combined to a DateTime type, the value is 10/21/2015 11:25:46 AM
* Converted back from DateTime, the time is 11:25 AM
*/
Dim theTime = New TimeOnly(11, 25, 46) ' 11: 25 PM And 46 seconds
Dim theDate = New DateOnly(2015, 10, 21) ' October 21, 2015
Dim theDateTime = theDate.ToDateTime(theTime)
Dim reverseTime = TimeOnly.FromDateTime(theDateTime)
Console.WriteLine($"Date only is {theDate}")
Console.WriteLine($"Time only is {theTime}")
Console.WriteLine()
Console.WriteLine($"Combined to a DateTime type, the value is {theDateTime}")
Console.WriteLine($"Converted back from DateTime, the time is {reverseTime}")
' This example produces the following output
'
' Date only is 10/21/2015
' Time only is 11:25 AM
'
' Combined to a DateTime type, the value is 10/21/2015 11:25:46 AM
' Converted back from DateTime, the time is 11:25 AM
Арифметические операторы и сравнение TimeOnly
Два экземпляра TimeOnly можно сравнить друг с другом, и можно использовать метод IsBetween для проверки того, входит ли время в интервал между двумя другими временами. При использовании оператора добавления или вычитания в TimeOnly
возвращается TimeSpan, представляющая длительность времени.
var start = new TimeOnly(10, 12, 01); // 10:12:01 AM
var end = new TimeOnly(14, 00, 53); // 02:00:53 PM
var outside = start.AddMinutes(-3);
var inside = start.AddMinutes(120);
Console.WriteLine($"Time starts at {start} and ends at {end}");
Console.WriteLine($" Is {outside} between the start and end? {outside.IsBetween(start, end)}");
Console.WriteLine($" Is {inside} between the start and end? {inside.IsBetween(start, end)}");
Console.WriteLine($" Is {start} less than {end}? {start < end}");
Console.WriteLine($" Is {start} greater than {end}? {start > end}");
Console.WriteLine($" Does {start} equal {end}? {start == end}");
Console.WriteLine($" The time between {start} and {end} is {end - start}");
/* This example produces the following output:
*
* Time starts at 10:12 AM and ends at 2:00 PM
* Is 10:09 AM between the start and end? False
* Is 12:12 PM between the start and end? True
* Is 10:12 AM less than 2:00 PM? True
* Is 10:12 AM greater than 2:00 PM? False
* Does 10:12 AM equal 2:00 PM? False
* The time between 10:12 AM and 2:00 PM is 03:48:52
*/
Dim startDate = New TimeOnly(10, 12, 1) ' 10:12:01 AM
Dim endDate = New TimeOnly(14, 0, 53) ' 02:00:53 PM
Dim outside = startDate.AddMinutes(-3)
Dim inside = startDate.AddMinutes(120)
Console.WriteLine($"Time starts at {startDate} and ends at {endDate}")
Console.WriteLine($" Is {outside} between the start and end? {outside.IsBetween(startDate, endDate)}")
Console.WriteLine($" Is {inside} between the start and end? {inside.IsBetween(startDate, endDate)}")
Console.WriteLine($" Is {startDate} less than {endDate}? {startDate < endDate}")
Console.WriteLine($" Is {startDate} greater than {endDate}? {startDate > endDate}")
Console.WriteLine($" Does {startDate} equal {endDate}? {startDate = endDate}")
Console.WriteLine($" The time between {startDate} and {endDate} is {endDate - startDate}")
' This example produces the following output
'
' Time starts at 10:12 AM And ends at 2:00 PM
' Is 10:09 AM between the start And end? False
' Is 12:12 PM between the start And end? True
' Is 10:12 AM less than 2:00 PM? True
' Is 10:12 AM greater than 2:00 PM? False
' Does 10:12 AM equal 2:00 PM? False
' The time between 10:12 AM and 2:00 PM is 03:48:52