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 DateTime
s__. 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.
🐧