【问题标题】:Is DateTime.Now reliable one for future use?DateTime.Now 是否可靠以备将来使用?
【发布时间】:2015-10-20 08:35:18
【问题描述】:

我正在使用 SQLite 开发桌面独立应用程序。

在我的应用程序中,我曾经将日期时间保存为 DateTime.Now 以标识用户上次访问、上次登录和许多其他用途的时间。它按预期工作。

现在的问题是当我在机器中将系统时间格式从“M/d/yyyy”更改为“d/M/yyyy”时,一切都搞砸了。

在我用来从 Sqlite DB 中检索日期时间并使用 Convert.ToDateTime("[retrived DB value]"); 将其转换为日期时间的所有区域中,我都遇到了异常

似乎Convert.ToDateTime 试图将日期时间从不同的文化转换为当前文化。

我觉得我以错误的方式实现了保存和检索 DateTime 的设计。 .不确定。

独立于系统日期时间文化的标准方法是什么?有什么想法吗?

注意:我在数据库中用于保存 DatimeTime 值的字段是“NTEXT”格式。

【问题讨论】:

  • 数据库中的字段是日期时间还是字符串(nvarchar)?
  • 我假设您将 DateTime 值保存为字符。看起来 SQLite 不支持将 DateTime 值保留为二进制文件。来自 link 中的 1.2 日期和时间数据类型部分;可以选择使用 INTEGER 将其保存为 Unix 时间(从 1970-01-01 00:00:00 UTC 开始的秒数)。
  • 通常有 3 种记录日期的方法,自预定义日期以来的刻度数(这曾经是标准,但不同的系统使用不同的开始日期,这使得转换非常痛苦),浮点数在分数是一天的分数(现在这是事实上的标准)的日子里,除了人类可读性之外的所有内容都非常糟糕的文本,您应该在保存之前始终转换为 UTC。
  • 当您使用 NText 时,您需要解析日期而不是转换它msdn.microsoft.com/en-us/library/kc8s65zs(v=vs.110).aspx

标签: c# sqlite


【解决方案1】:

刚刚意识到,在 Sqlite 中,它将 Datetime 存储为 text/integer/real。我相信您已经以​​ YYYY-MM-DD HH:MM:SS.SSS 格式存储了您的文件(TEXT 为 ISO8601)。我的评价基于this and only this

检索时可以精确解析:

var formatString = "YYYY-MM-DD HH:MM:SS.SSS";
var sample = "2010-06-11 22:19:12.123";
var dt = DateTime.ParseExact(sample, formatString, null);

标准做法应该是存储到/从是不变的文化。当您想要显示时,您可以在此处将不变式转换为用户的 UI 区域设置。

还可以查看link,这将帮助您在短期内解决问题。这基本上是在连接字符串中指定日期时间格式。

【讨论】:

  • 这不正确 - SQLite 将日期存储为 REAL、INTEGER 或 STRING 格式,采用 ISO8601 格式。这与 UI 语言环境或 Invariant 文化没有任何关系
【解决方案2】:

你在这里问了 2 个问题

1 现在是获取当前日期时间的可靠方法

DateTime.Now 获取本地机器上的当前本地时间,在许多情况下这很好,但是在涉及多台机器的任何情况下,您应该始终使用 UTC 日期,即 UtcNow,因为它存储了全球时间然后可以将其转换为使用它的机器的本地时间。

此外,如果您想用一个共同的日期来链接同时发生的事件,您应该始终使用相同的源机器,通常是服务器来获取正确的时间,因为您不希望人们能够更改他们机器上的时间并破坏系统

2 为什么我更改日期格式时它会中断

这是因为您没有保存日期,而是保存了一个字符串,而字符串日期完全没有意义,没有关于如何读取(解析)它的说明,这要么必须从您的系统中自动查找(即文化)或手动指定,因为您永远无法确保两台机器使用相同的文化然后自动查找它通常是一个非常非常糟糕的主意。

我建议将您的数据库字段更改为实际将日期保存为日期而不是文本并在保存之前转换为 UTC

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-15
    • 1970-01-01
    • 2011-08-26
    • 2015-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多