Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to convert DateTime of type DateTimeKind.Unspecified to DateTime.Kind.Utc in C# (.NET)

I've inherited C# code that has an awful lot of DateTimes where the Kind property is DateTimeKind.Unspecified. These are fed into Datetime.ToUniversalTime() which gives back a UTC datetime (it adds 7 hours in my case). This is how ToUniversalTime() works; see MSDN. The problem is that these DateTimes are in fact already in UTC time. They are pulled out of a SQL Server Compact 4.0 database. They were stored there in UTC. My main question is:

  1. How do I modify the Kind property of a DateTime so that it's UTC and not Unspecified? I don't want to change the time or date. So for example, a date of April 1st 2013, 9:05 am with its Kind property of "Unspecified" should become a datetime of April 1st 2013, 9:05 UTC.

If I could be indulged with a follow up question(s), it would be:

  1. Are values necessarily returned from Sql Server Compact as "Unspecified"? Inside Sql Server Compact, they are being stored as type (datetime, not null). Looking at the code, it appears they are just put in the database, but there are no provisions to mark them as UTC or anything. Is there a better way to handle things? Is there a slick way to ensure the DateTimes come out of SQL Compact as UTC?

Please let me know if I can provide more details. I'm new to this code base and still getting my brain around it, so I'm having trouble describing the problem perfectly.

Dave

like image 528
Dave Avatar asked Oct 26 '16 21:10

Dave


People also ask

How do you convert DateTime to UTC?

The ToUniversalTime method converts a DateTime value from local time to UTC. To convert the time in a non-local time zone to UTC, use the TimeZoneInfo. ConvertTimeToUtc(DateTime, TimeZoneInfo) method. To convert a time whose offset from UTC is known, use the ToUniversalTime method.

Why DateTime kind is unspecified?

If you store a DateTime object to the DB with a DateTimeKind of either Utc or Local , when you read that record back from the DB you'll get a DateTime object whose kind is Unspecified . Basically, it appears the Kind property isn't persisted.

What is DateTimeKind?

DateTimeKind Enum (System)Specifies whether a DateTime object represents a local time, a Coordinated Universal Time (UTC), or is not specified as either local time or UTC.

How do I convert DateTime to timezone?

To do this, we will use the FindSystemTimeZoneById() of TimeZoneInfo class. This function takes Id as a parameter to return the equivalent time in timezone passed. In the example below, we are taking the current system time and converting it into “Central Standard Time”. DateTime currentTime = TimeZoneInfo.


1 Answers

Do you maybe need something like this:

var unspecified = new DateTime(2016, 12, 12, 10, 10, 10, DateTimeKind.Unspecified); var specified = DateTime.SpecifyKind(unspecified, DateTimeKind.Utc); 

About SpecifyKind() method from MSDN:

The SpecifyKind method creates a new DateTime object using the specified kind parameter and the original time value.

It will create new object, new Kind and same time value. You cannot change Kind of existing object, you need to create new one with same values and different Kind.

Regarding to other question here are supported types in SQL Compact. And here is issue regarding to DateTimeOffset. It looks like that it is not supported yet in Sql Compact.

like image 51
kat1330 Avatar answered Sep 20 '22 06:09

kat1330