Convert DateTimeOffset to Int64 and back to DateTimeOffset
我需要将DateTimeOffset添加到我维护的二进制序列化库中。 使用DateTime,我只是将ticks保存为Int64,但DateTimeOffset没有作为构造函数的ticks。 如何正确地重建?
例
1 2 3 4 5 6 7
| DateTime date = new DateTime .Now;
long ticks = date .Ticks;
DateTime date2 = new DateTime (ticks );
DateTimeOffset dateOffset = new DateTimeOffset .Now;
long ticks2 = dateOffset .Ticks;
DateTimeOffset dateOffset2 = new DateTimeOffset (?) |
-
首先点击Google:从UTC Ticks重建DateTimeOffset; 第二击:MSDN:dateAndTime = new DateTimeOffset(633452259920000000, new TimeSpan(1, 0, 0));。 我建议你使用UtcTicks。
-
您如何看待使用DateTimeOffset.FromFileTime和DateTimeOffset.ToFileTime? 文档称它是UTC值。docs.microsoft.com/en-us/dotnet/api/…
-
如果这符合您的需求那么为什么不呢?
-
DateTime.Now返回DateTime值,Kind设置为DateTimeKind.Local,而DateTime(Int64)构造函数创建一个Kind设置为DateTimeKind.Unspecified的值。 此语句将失败:Debug.Assert(date.Kind.Equals (date2.Kind),"DateTime Kind mismatch");以考虑Kind的方式序列化DateTime使用DateTime.ToBinary()和DateTime.FromBinary(Int64)方法。 即便如此,FromBinary返回的值可能与原始值不匹配 - 请参阅此处的警告
DateTimeOffset does not have ticks as a constructor
它确实有一个带刻度和偏移的构造函数......
1
| DateTimeOffset(Int64, TimeSpan) |
...而TimeSpan可以用刻度值构建......
...所以,您可以将DateTimeOffset序列化为两个Int64值...
1 2 3 4 5 6 7 8
| DateTimeOffset dto = DateTimeOffset .Now;
var ticks = dto .Ticks;
var offset = dto .Offset.Ticks;
DateTimeOffset newDto = new DateTimeOffset (ticks, new TimeSpan (offset ));
Debug .Assert(dto .EqualsExact(newDto ), "DateTmeOffset Mismatch"); |
-
只需使用UTC值,您就可以完全忽略时间跨度并使用单个Int64值(并使用TimeSpan.Zero)。完全按照建议。
-
@RobIII将DateTimeOffset更改为DateTime确实意味着您可以使用单个Int64。但是序列化的项目不会是DateTimeOffset!
-
谁说了DateTime?我指的是DateTimeOffset
-
我认为如果你有一个DateTimeOffset,转换为UTC并丢弃'Offset',你基本上有一个DateTime,Kind设置为Utc。对于许多用途,UTC(和DateTime)是完全合适的。但是如果使用DateTimeOffset,则可以假设偏移是显着的。今天上午11:00在加利福尼亚(9/17/2018 11:00:00 AM -07:00)和另一个今天下午2:00在纽约考虑DateTimeOffset(9/17/2018 2:00 :00 PM -04:00)。两者都是9/17/2018 6:00:00 PM +00:00。在许多情况下,如果你需要知道偏移量和时间,UTC就足够了。
-
但这一切都不是问题。 OP要求将DateTimeOffset转换为Int64并返回(参见标题:"将DateTimeOffset转换为Int64并返回DateTimeOffset")。如果偏移是重要的,那么,是的,当然你需要(de)序列化那个,但是单个Int64是不够的。