【发布时间】:2017-02-01 15:48:22
【问题描述】:
在一个 WinRT(Windows 8.1 应用商店应用)项目中,我使用 SQLite.Net-PCL 和 SQLiteNetExtensions NuGet 包将数据存储在本地 SQLite 数据库文件中。
我的几个数据模型(又名表)包含DateTimeOffset 类型的属性。目的是在不丢失偏移信息的情况下存储这些。 (这样做的原因是用户可以在指定日期/时间的同时输入时区信息,而且这些信息必须存储在数据库中。)
我知道可以在创建 SQLiteConnection 时设置 storeDateTimeAsTicks 参数,将其设置为 false 会强制所有 DateTime 属性以 ISO 格式存储为文本 - 但是,这没有对DateTimeOffset 属性的影响,因为这些属性总是自动转换为 UTC 并存储为代表刻度的数字。
我可以想到以下4种方法:
- 手动将
DateTimeOffset转换为string属性并存储这些属性,或者 - 提取
DateTimeOffset的DateTime和偏移(作为TimeSpan日期类型)部分,并将它们存储在两个单独的列中,
=> 但是对于这两种方法,我都需要向数据模型添加额外的属性,使用 [Ignore] 属性标记原始的 DateTimeOffset 属性,并处理手动转换(双向) - 因为我d 需要将它应用到很多不同的数据模型类,这似乎太难维护了。
- 将
DateTimeOffset的DateTime和TimeSpan(偏移)部分存储在单独表的两列中,并维护对该单独表的引用
=> 但在这种情况下,我需要定义自定义数据类型(以指定应如何存储 DateTime 和 TimeSpan 部分),并且不能使用默认的 .NET DateTimeOffset 类型
- 使用 SQLiteNetExtensions 的
TextBlob属性以某种方式将DateTimeOffset序列化为单个文本列
=> 但这感觉有点 hacky,我需要确保只有 SQLiteNetExtensions 的扩展方法用于数据库插入/更新,并且我仍然需要在所有数据模型类上附加一个 string 属性...
所以,我的问题是:我是否缺少更直接、更明显的解决方案?
【问题讨论】:
-
我还没有成功测试过,但是你试过使用SQLite.Net.DateTimeOffset nuGet包吗?使用文档在这里:github.com/mobilemotion/SQLite.Net.DateTimeOffset
-
感谢@nullPainter - 我自己编写并发布了 Nuget 库,因为没有人能回答我的问题。一旦我有更多时间,我可能应该尽快发布问题的答案......
-
旁注:
DateTimeOffset几乎与DateTime+ "user timezone" 不同。事实上,大多数人关心的部分是时区,或者通常是 DST 周围的行为(偏移量是次要考虑因素)。如果您要存储绝对值,始终映射到同一时刻,那么实际区域并不重要。另一方面,如果偏移量确实发生了任何未来的日期/时间可能会合理地改变(如果 DST 通常被调整),例如对于日历/调度程序,单独存储偏移量不太可能完全有帮助。
标签: c# .net sqlite datetimeoffset