代码之家  ›  专栏  ›  技术社区  ›  Oleg Sh

DateTimeOffset,不清楚

  •  1
  • Oleg Sh  · 技术社区  · 10 年前

    我阅读了关于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:01pm+ 7: 30”,属性返回日期“2007年12月1日下午4:01”。

    我有+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 instense的属性DateTime具有DateTime WITH Offset。我错在哪里?

    2 回复  |  直到 10 年前
        1
  •  4
  •   dbugger    10 年前

    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。

        2
  •  1
  •   Zoomzoom    10 年前

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

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

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