我阅读了有关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。我哪里错了?
答案 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属性的值转换为您的本地时间。