Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to persist DateTime Kind while storing a datetime object into a data table?

I’m facing an issue with storing the DateTime object into a datatable, it looses the Kind information set into it.For example if the DateTime.Kind is UTC, once I assign it to the datarow value it changes the Kind to Unspecified.Please find the code below.

public class LocalTimeToUtcConverter
    {
        public DateTime Convert(DateTime localDate)
        {
            var utcOffset = TimeZoneInfo.Local.GetUtcOffset(localDate);

            var utc = localDate.ToUniversalTime();

            return utc + utcOffset;
        }
    }

 [Test]
        public void Should_set_datetime_column_kind_to_utc()
        {            
            var localDate = new DateTime(2010, 11, 01, 00, 00, 00);
            Assert.That(localDate.Kind == DateTimeKind.Unspecified);
            var converter = new LocalTimeToUtcConverter();
            DateTime date = converter.Convert(localDate);
            Assert.That(localDate.Kind == DateTimeKind.Utc);
            var data = CreateTable(date);
            //Failes-Why????
            Assert.That(((DateTime)data.Rows[0].ItemArray[0]).Kind ==   DateTimeKind.Utc);
        }

        private DataTable CreateTable(DateTime date)
        {            
            DataTable table = new DataTable();            
            table.Columns.Add(new DataColumn("Date1", typeof(DateTime)));

            for (int i = 0; i < 10; i++)
            {
                var newRow = table.NewRow();
                newRow[0] = date;
                table.Rows.Add(newRow);
            }

            return table;
        }

Please can you tell me a workaround for this?

Thanks!!!

like image 900
Mike Avatar asked Oct 21 '10 18:10

Mike


People also ask

How do I set DateTime kind to UTC?

CSharp Online Training The DateTime. SpecifyKind() method in C# is used to create a new DateTime object that has the same number of ticks as the specified DateTime but is designated as either local time, Coordinated Universal Time (UTC), or neither, as indicated by the specified DateTimeKind value.

What does DateTime kind do?

The Kind property allows a DateTime value to clearly reflect either Coordinated Universal Time (UTC) or the local time. In contrast, the DateTimeOffset structure can unambiguously reflect any time in any time zone as a single point in time.


1 Answers

table.Columns.Add(new DataColumn("Date1", typeof(DateTime)));

Use the DataColumn.DateTimeMode property:

var col = new DataColumn("Date1", typeof(DateTime));
col.DateTimeMode = DataSetDateTime.Utc;
table.Columns.Add(col);

This shouldn't matter if you store dates in your dbase in UTC, like you should.

like image 125
Hans Passant Avatar answered Oct 23 '22 09:10

Hans Passant