Working with DateOnly and TimeOnly in C#

Introduction

Date and time are fundamental aspects of many applications, and in C#, managing them has historically involved using the DateTime structure. However, C# 10.0 introduced two new valuable additions: DateOnly and TimeOnly. These types provide a more elegant and precise way to work with date-only and time-only values, respectively. In this blog post, we'll explore how to use DateOnly and TimeOnly in your C# applications.

The tools that I have leveraged for the blog are given below.

  1. VS 2022 Community Edition
  2. .NET 6.0
  3. Console App

The source code can be downloaded from GitHub.

DateOnly in C#

DateOnly is designed to work with date-only values, focusing exclusively on the year, month, and day components. It simplifies working with dates by removing the time and time zone information, making your code more precise and readable.

Here's how you can create a DateOnly instance.

public static void DateOnlyExample()
{
    // <SnippetDateOnly>
    DateOnly dateOnly = new DateOnly(2020, 12, 25);
    Console.WriteLine($"DateOnly Sample :  {dateOnly}");  
    // </SnippetDateOnly>
}

Another sample will create a DateOnly instance from an existing DateTime type.

public static void DateOnlyFromDateTimeExample()
{
    // <SnippetDateOnlyFromDateTime>
    
    var dateOnly = DateOnly.FromDateTime(DateTime.Now);
    Console.WriteLine($"DateOnly From DateTime :  {dateOnly}");  
    // </SnippetDateOnlyFromDateTime>
}

Benefits of DateOnly

  • Clarity: When you use DateOnly, your code explicitly communicates that you are working with date-only data. This enhances code readability and prevents confusion, especially when you don't need time-related information.
  • Immutability: DateOnly instances are immutable, meaning their values cannot be modified once they are created. This immutability ensures data integrity and prevents accidental changes.
  • No Time Zone Hassles: With DateOnly, you don't need to deal with time zones or daylight-saving time adjustments. It focuses solely on the date component, making your code more straightforward.

TimeOnly in C#

TimeOnly complements DateOnly by providing a way to work with time-only values. It includes hours, minutes, seconds, and fractions of a second (milliseconds, microseconds, or nanoseconds), allowing you to represent time-of-day data with precision.

Here's how you can create a TimeOnly instance.

public static void TimeOnlyExample()
{
    // <SnippetTimeOnly>
    TimeOnly timeOnly = new TimeOnly(12, 30, 45);
    Console.WriteLine($"TimeOnly Sample :  {timeOnly}");  
    // </SnippetTimeOnly>
}

Another sample will create a TimeOnly instance from an existing DateTime type.

public static void TimeOnlyFromDateTimeExample()
{
    // <SnippetTimeOnlyFromDateTime>
    
    var timeOnly = TimeOnly.FromDateTime(DateTime.Now);
    Console.WriteLine($"TimeOnly From DateTime :  {timeOnly}");  
    // </SnippetTimeOnlyFromDateTime>
}

Benefits of TimeOnly

  • Precision: When you work with time-only data, TimeOnly provides a high level of precision, allowing you to capture time intervals and durations accurately.
  • Immutability: Like DateOnly, TimeOnly instances are immutable, ensuring that your time-related values remain consistent throughout your code.
  • Enhanced Code Readability: Using TimeOnly clearly communicates that you are dealing with time-of-day data, improving code readability, and reducing the risk of errors.

Combining DateOnly and TimeOnly

While DateOnly and TimeOnly are primarily intended for date-only and time-only values, respectively, you can still combine them to work with date and time together. For instance, you can use a DateOnly for the date portion and a TimeOnly for the time portion, offering the benefits of both types.

Console.WriteLine("Combine DateOnly and TimeOnly Examples!");

DateOnly dateOnly = new DateOnly(2020, 12, 25);
TimeOnly timeOnly = new TimeOnly(12, 30, 45);
DateTime combinedDateTime = dateOnly.ToDateTime(timeOnly);

Console.WriteLine($"Combined DateTime :  {combinedDateTime}");

Conclusion

DateOnly and TimeOnly are valuable additions to the C# language, making it easier and more precise to work with date-only and time-only values. By using these types in your applications, you can enhance code clarity, readability, and maintainability, all while avoiding common pitfalls associated with managing date and time components manually. Whether you're building a calendar application, managing schedules, or simply working with dates and times in your code, DateOnly and TimeOnly are powerful tools to have in your C# toolkit.