C# 在PostgreSQL中存储基于节点时间的值的最佳方法是什么?

C# 在PostgreSQL中存储基于节点时间的值的最佳方法是什么?,c#,postgresql,nodatime,C#,Postgresql,Nodatime,我们正在实现PostgreSQL,还决定使用NodeTime而不是标准的.NET DateTime。PostgreSQL具有“带时区的时间戳”类型,NodeTime通过SystemClock.Instance.Now方法返回带时区的日期和时间值。但是,SystemClock.Instance.Now(2015-07-17T13:22:52Z)返回的值不能直接写入PostgreSQL字段。有没有处理NodaTime/PostgreSQL实现的最佳实践?据我所知,“带时区的时间戳”用词不当-它只是“

我们正在实现PostgreSQL,还决定使用NodeTime而不是标准的.NET DateTime。PostgreSQL具有“带时区的时间戳”类型,NodeTime通过SystemClock.Instance.Now方法返回带时区的日期和时间值。但是,SystemClock.Instance.Now(2015-07-17T13:22:52Z)返回的值不能直接写入PostgreSQL字段。有没有处理NodaTime/PostgreSQL实现的最佳实践?

据我所知,“带时区的时间戳”用词不当-它只是“您提供一个带有本地值的时区,PostgreSQL将存储UTC”。。。换句话说,这实际上是一个额外的转换,而不是存储更多的数据


如果您只是试图存储一个
即时
,那么
时间戳
作为一种数据类型应该可以。在向数据库获取值方面,您可能只需要将其转换为
DateTimeOffset
,然后由驱动程序处理。您在存储和检索时都需要使用。

谢谢,@Jon,您让我走上了正确的道路。Instant似乎没有ToDateTimeOffset方法(它确实有FromDateTimeOffset方法),但SystemClock.Instance.Now.ToDateTimeOffset()完成了这个任务。然而,我可能会试图说服团队只存储即时值。@Tortilla:我不同意你的观点。是什么让你认为
Instant
没有
ToDateTimeOffset
?如果
SystemClock.Instance.Now.ToDateTimeOffset()
不起作用,它怎么可能工作呢?你所说的“只存储
Instant
值”是什么意思?我键入了
Instant
并试图键入
ToDateTimeOffset
,但它没有显示在方法列表中。如果我只是通过像
Instant.ToDateTimeOffset()那样键入来强制它
,我在访问静态上下文中的非静态方法时出错。通过存储即时值,我考虑只使用一个长整型字段,并存储
Instant
@tortillasheep中的原始刻度值。是的,这是一个实例方法-您可以在
Instant
上调用它,将其转换为
DateTimeOffset
。您可以存储原始的刻度,但这对其他任何人来说都是一件痛苦的事情-我认为
时间戳
通常更友好。不明确的时间(25小时-天的回退过渡时间)如何?它们是否唯一地表示为DB上的DateTimeOffset,没有冲突?