C# DateTimeOffset LocalDateTime 与 ToLocalTime

C# DateTimeOffset LocalDateTime vs ToLocalTime

谁能解释一下 ToLocalTime() 方法和 C# DateTimeOffset 中的 LocalDateTime 属性 之间的区别?

文档说明如下:

LocalDateTime:

Gets a DateTime value that represents the local date and time of the current DateTimeOffset object.

ToLocalTime():

Converts the current DateTimeOffset object to a DateTimeOffset object that represents the local time.

查看 code,我们可以看到 LocalDateTime 属性 获取它表示为 UTC DateTime 对象的值,然后使用 DateTime 对象的 ToLocalTime() 方法。

public DateTime UtcDateTime {
    [Pure]
    get {
        Contract.Ensures(Contract.Result<DateTime>().Kind == DateTimeKind.Utc);
        return DateTime.SpecifyKind(m_dateTime, DateTimeKind.Utc);
    }
}

public DateTime LocalDateTime {
    [Pure]
    get {
        Contract.Ensures(Contract.Result<DateTime>().Kind == DateTimeKind.Local);
        return UtcDateTime.ToLocalTime();
    }
}

而且我们可以看到 .ToLocalTime() 只是使用相同的 UtcDateTime 属性 来检索 UTC DateTime 对象,再次调用 ToLocalTime() 然后包装它在一个新的 DateTimeOffset 对象中:

public DateTimeOffset ToLocalTime() {
    return ToLocalTime(false);
}

internal DateTimeOffset ToLocalTime(bool throwOnOverflow)
{
    return new DateTimeOffset(UtcDateTime.ToLocalTime(throwOnOverflow));
}

您可以使用此代码测试结果:

DateTimeOffset dto = new DateTimeOffset(2020, 10, 01, 9, 0, 0, 0, TimeSpan.FromHours(9));
Console.WriteLine(dto.ToString(System.Globalization.CultureInfo.InvariantCulture)); // 10/01/2020 09:00:00 +09:00

DateTime localTimeDt = dto.LocalDateTime;
Console.WriteLine(localTimeDt.ToString(System.Globalization.CultureInfo.InvariantCulture)); // 10/01/2020 02:00:00

DateTimeOffset localTimeDto = dto.ToLocalTime();
Console.WriteLine(localTimeDto.ToString(System.Globalization.CultureInfo.InvariantCulture)); // 10/01/2020 02:00:00 +02:00

当然,DateTimeOffset 会保留 Rextester 系统时间的 +2:00,因为这是它所基于的时区。

Link to test