DateTimeOffset vs DateTime

Posted 云霄宇霁

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DateTimeOffset vs DateTime相关的知识,希望对你有一定的参考价值。

很多时候在开发过程中DateTimeOffset和DateTime混淆不知道如何用,这里总结一下

DateTimeOffset可以反映出相对于UTC的时间偏移量。

1、用DateTimeOffset表示local时间

var dateNow = DateTime.Now;
var offset = System.TimeZoneInfo.Local.GetUtcOffset(DateTime.Now);
var date = new DateTimeOffset(dateNow.Ticks, offset);
Console.WriteLine($"Current local date: dateNow, datetimeoffset: date.");

2、用DateTimeOffset表示UTC时间

var utcNow = DateTime.UtcNow;
var date = new DateTimeOffset(utcNow.Ticks, TimeSpan.Zero);
Console.WriteLine($"Current UTC date: utcNow, datetimeoffset: date.");

3、以下示例定义名为 ConvertFromDateTimeOffset 的方法,该方法可将 DateTimeOffset 值转换为 DateTime 值。 它可根据其偏移量确定 DateTimeOffset 值是 UTC 时间,还是本地时间或其他时间,并定义返回的日期和时间值相应的 Kind 属性。

static DateTime ConvertFromDateTimeOffset(DateTimeOffset dateTime)

   if (dateTime.Offset.Equals(TimeSpan.Zero))
      return dateTime.UtcDateTime;
   else if (dateTime.Offset.Equals(TimeZoneInfo.Local.GetUtcOffset(dateTime.DateTime)))
      return DateTime.SpecifyKind(dateTime.DateTime, DateTimeKind.Local);
   else
      return dateTime.DateTime;

4、DateTimeOffset中Offset属性与ToOffset方法

      如果同时指定Offset及ToOffset,DateTimeOffset返回的datetime既是传入DateTimeOffset的datetime

var offset = System.TimeZoneInfo.Local.GetUtcOffset(DateTime.Now);

var dateNow = DateTime.Now;
var localDate = new DateTimeOffset(dateNow.Ticks, offset).ToOffset(offset);
Console.WriteLine($"Current local date: dateNow, datetimeoffset:localDate.");


var utcNow = DateTime.UtcNow;
var utcDate = new DateTimeOffset(utcNow.Ticks, offset).ToOffset(offset);
Console.WriteLine($"Current UTC date: utcNow, datetimeoffset: utcDate.");

 

以上是关于DateTimeOffset vs DateTime的主要内容,如果未能解决你的问题,请参考以下文章

“DateTime”和“DateTimeOffset”之间的区别[重复]

如何将 C# datetimeOffset 转换为指定格式

datetimeoffset 休眠映射

Caliburn.Micro 将 DateTimeOffset 绑定到 DatePicker

模棱两可的 DateTimeOffset 示例

你啥时候更喜欢 DateTime 而不是 DateTimeOffset