在一个 WinRT (Windows 8.1 Store App) 项目中,我正在使用 SQLite.Net-PCL 和 SQLiteNetExtensions NuGet 包将数据存储在本地 SQLite 数据库文件中。我的一些数据模型(也称为表)包含 DateTimeOffset 类型的属性。目的是在不丢失偏移信息的情况下存储这些属性。(原因是用户可以在指定日期/时间时输入时区信息,这些信息必须存储在数据库中。)
我知道在创建 SQLiteConnection 时可以设置 storeDateTimeAsTicks 参数,并将其设置为 false,强制所有 DateTime 属性以 ISO 格式的文本形式存储 - 然而,这对 DateTimeOffset 属性没有任何影响,因为它们总是自动转换为 UTC 并作为表示 ticks 的数字存储。
我可以想到以下四种方法:
- 手动将 DateTimeOffset 转换为 string 属性并存储这些属性。 - 提取 DateTimeOffset 的 DateTime 和 offset(作为 TimeSpan 日期类型),并将它们分别存储在两个单独的列中。 - 在另一个表的两个列中存储 DateTimeOffset 的 DateTime 和 TimeSpan(offset)部分,并维护对该表的引用。
但是对于这两种方法,我需要向数据模型添加其他属性,使用 [Ignore] 属性标记原始 DateTimeOffset 属性,并处理手动转换(双向)。由于我需要将其应用于许多不同的数据模型类,所以维护似乎太难了。
我知道在创建 SQLiteConnection 时可以设置 storeDateTimeAsTicks 参数,并将其设置为 false,强制所有 DateTime 属性以 ISO 格式的文本形式存储 - 然而,这对 DateTimeOffset 属性没有任何影响,因为它们总是自动转换为 UTC 并作为表示 ticks 的数字存储。
我可以想到以下四种方法:
- 手动将 DateTimeOffset 转换为 string 属性并存储这些属性。 - 提取 DateTimeOffset 的 DateTime 和 offset(作为 TimeSpan 日期类型),并将它们分别存储在两个单独的列中。 - 在另一个表的两个列中存储 DateTimeOffset 的 DateTime 和 TimeSpan(offset)部分,并维护对该表的引用。
但是对于这两种方法,我需要向数据模型添加其他属性,使用 [Ignore] 属性标记原始 DateTimeOffset 属性,并处理手动转换(双向)。由于我需要将其应用于许多不同的数据模型类,所以维护似乎太难了。
在这种情况下,我需要定义一个自定义数据类型(以指定如何存储DateTime
和TimeSpan
部分),并且不能使用默认的.NET DateTimeOffset
类型。
- 可以使用SQLiteNetExtensions的
TextBlob
属性将DateTimeOffset
序列化为单个文本列
但是这种方法感觉有点巧妙,我需要确保只使用SQLiteNetExtensions的扩展方法进行数据库插入/更新,并且仍然需要在所有数据模型类上添加一个额外的string
属性......
所以,我的问题是:是否有更直接、明显的解决方案我忽略了?
DateTimeOffset
几乎从不与DateTime
+ "用户时区" 相同。实际上,大多数人关心的部分是时区,或者经常围绕 DST 的行为(偏移量是次要考虑因素)。如果您存储绝对、始终映射到相同瞬间的时间,则实际区域有些不重要。另一方面,如果任何未来的日期/时间可能会合理地更改偏移量(通常是调整 DST),例如日历/计划程序,则仅存储偏移量不太可能完全有所帮助。 - Clockwork-Muse