Linq to SQL DateTime values are local (Kind=Unspecified) - How do I make it UTC?
The generated LinqToSql code provides extensibility points, so you can set values when the objects are loaded.
The key is to create a partial class which extends the generated class, and then implement the OnLoaded
partial method.
For instance, let's say your class is Person
, so you have a generated partial Person
class in Blah.designer.cs
.
Extend the partial class by creating a new class (must be in a different file), as follows:
public partial class Person { partial void OnLoaded() { this._BirthDate = DateTime.SpecifyKind(this._BirthDate, DateTimeKind.Utc); }}
SQL Server DateTime does not include any timezone or DateTimeKind information, therefore DateTime values retrieved from the database correctly have Kind = DateTimeKind.Unspecified.
If you want to make these times UTC, you should 'convert' them as follows:
DateTime utcDateTime = new DateTime(databaseDateTime.Ticks, DateTimeKind.Utc);
or the equivalent:
DateTime utcDateTime = DateTime.SpecifyKind(databaseDateTime, DateTimeKind.Utc);
I assume your problem is that you are attempting to convert them as follows:
DateTime utcDateTime = databaseDateTime.ToUniversalTime();
This may appear reasonable at first glance, but according to the MSDN documentation for DateTime.ToUniversalTime, when converting a DateTime whose Kind is Unspecified:
The current DateTime object is assumed to be a local time, and the conversion is performed as if Kind were Local.
This behavior is necessary for backwards compatibility with .NET 1.x, which didn't have a DateTime.Kind property.
The only way I can think to do this would be to add a shim property in a partial class that does the translation...