C# DateTimeOffset LocalDateTime 与 ToLocalTime
C# DateTimeOffset LocalDateTime vs ToLocalTime
谁能解释一下 ToLocalTime() 方法和 C# DateTimeOffset 中的 LocalDateTime 属性 之间的区别?
文档说明如下:
Gets a DateTime value that represents the local date and time of the current DateTimeOffset object.
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,因为这是它所基于的时区。
谁能解释一下 ToLocalTime() 方法和 C# DateTimeOffset 中的 LocalDateTime 属性 之间的区别?
文档说明如下:
Gets a DateTime value that represents the local date and time of the current DateTimeOffset object.
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,因为这是它所基于的时区。