C# tip: create correct DateTimes with DateTimeKind

One of the most common issues we face when developing applications is handling dates, times, and time zones.

Let's say that we need the date for January 1st, 2020, exactly 30 minutes after midnight. We would be tempted to do something like:

var plainDate = new DateTime(2020, 1, 1, 0, 30, 0);

It makes sense. And plainDate.ToString() returns 2020/1/1 0:30:00, which is correct.

But, as I explained in a previous article, while ToString does not care about time zone, when you use ToUniversalTime and ToLocalTime, the results differ, according to your time zone.

Let's use a real example. Please, note that I live in UTC+1, so pay attention to what happens to the hour!

var plainDate = new DateTime(2020, 1, 1, 0, 30, 0);

Console.WriteLine(plainDate);  // 2020-01-01 00:30:00
Console.WriteLine(plainDate.ToUniversalTime());  // 2019-12-31 23:30:00
Console.WriteLine(plainDate.ToLocalTime());  // 2020-01-01 01:30:00

This means that ToUniversalTime considers plainDate as Local, so, in my case, it subtracts 1 hour. On the contrary, ToLocalTime considers plainDate as UTC, so it adds one hour.

So what to do?

Always specify the DateTimeKind parameter when creating DateTimes__. This helps the application understanding which kind of date is it managing.

var specificDate = new DateTime(2020, 1, 1, 0, 30, 0, DateTimeKind.Utc);

Console.WriteLine(specificDate); //2020-01-01 00:30:00
Console.WriteLine(specificDate.ToUniversalTime()); //2020-01-01 00:30:00
Console.WriteLine(specificDate.ToLocalTime()); //2020-01-01 00:30:00

As you see, it's always the same date.

Ah, right! DateTimeKind has only 3 possible values:

public enum DateTimeKind
{
    Unspecified,
    Utc,
    Local
}

So, my suggestion is to always specify the DateTimeKind parameter when creating a new DateTime.

If you want to know more about Time and Timezones, I'd suggest watching this YouTube video by Computerphile.

👉 Let's discuss it on Twitter or on the comment section below.

🐧

code4it

Ciao! I'm Davide Bellone, a .NET software developer! Let's keep in touch on Twitter!