DateTimeOffset,不清楚理解

时间:2015-02-27 20:18:39

标签: c# date datetime datetimeoffset

我阅读了有关DateTimeOffset的文档,属性DateTime。

https://msdn.microsoft.com/en-us/library/system.datetimeoffset.datetime(v=vs.110).aspx

  

DateTime属性不受Offset值的影响   属性。此属性返回日期和时间组件   DateTimeOffset对象,这使它对执行有用   DateTimeOffset到DateTime转换。例如,如果   DateTimeOffset对象的日期和时间值为“1/12/07 4:01 pm +   7:30“,酒店返回日期为”1/12/07 4:01 pm“。

我有+2 GMT时区并尝试以下代码:

    var dateString = "2012-03-01 00:00:00-23:00";
    var birthDay = DateTime.Parse(dateString);
    DateTimeOffset dtOffset = new DateTimeOffset(birthDay);

然后我查看dtOffset对象的属性DateTime并查看{3/2/2012 1:00:00 AM}值。 UtcDateTime的值为{3/1/2012 11:00:00 PM},LocalDateTime的值为{3/2/2012 1:00:00 AM}。因此,DateTimeOffset instanse的属性DateTime具有DateTime WITH Offset。我哪里错了?

2 个答案:

答案 0 :(得分:4)

DateTimeOffset确实应该被称为ADateTimeWithAnOffset,因为它有两个属性 - 您提供的DateTime和Offset。这使得它对转换很有用,但不会自行转换任何内容。

From the docs ... DateTimeOffset结构包括DateTime值以及Offset属性,该属性定义当前DateTimeOffset实例的日期和时间与协调世界时(UTC)之间的差异。

您的时间很有趣,不是因为DateTimeOffset,而是因为您的初始字符串格式。只要将偏移量添加到字符串的发送中,它就会在创建基础DateTime时考虑您的本地时间偏移量。在我的时区,即UCT-5,这就是发生的事情......

Console.WriteLine(DateTime.Parse( "2012-03-01"));
3/1/2012 12:00:00 AM

Console.WriteLine(DateTime.Parse("2012-03-01  00:00:00-23:00"));
3/1/2012 6:00:00 PM

如果您检查基础DateTime上的Kind属性,只要您从带有偏移的字符串创建它,就会看到它是Local。

答案 1 :(得分:1)

我认为你错过的是UtcDateTime和LocalDateTime实际上是转换。因此,如果您引用这两个属性,则需要转换值。因此,他们得到的值与“DateTime属性不受Offset属性值的影响”语句不矛盾。

UtcDateTime使用偏移量将DateTime属性的值转换为UTC(它向DateTime部分添加了23个小时)。

LocalDateTime根据您的Windows TimeZone设置(必须是UTC-1?)将DateTime属性的值转换为您的本地时间。