是DateTime.Now可靠的将来使用?

时间:2015-10-20 08:35:18

标签: c# sqlite

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

在我的应用程序中,我曾经将日期时间保存为DateTime.Now,以便在用户上次访问,上次登录以及许多其他目的时保存身份。它对我有效。

现在的问题是当我从" M / d / yyyy"更改系统时间格式时到" d / M / yyyy"在机器里,每件事都搞砸了。

我在以前用于从Sqlite DB检索Datetime并使用Convert.ToDateTime("[retrived DB value]");

将其转换为datetime的所有区域都出现了Exception

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

我失败了我实现了设计,以错误的方式保存和检索DateTime。 。不确定。

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

注意:我在DB中用来保存DatimeTime值的字段在" NTEXT"格式。

2 个答案:

答案 0 :(得分:4)

刚才意识到,在Sqlite中,它将Datetime存储为text / integer / real。我相信你已经以格式YYYY-MM-DD HH:MM:SS.SSS(TEXT as 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这将帮助您在短期内解决问题。这基本上是在连接字符串中指定日期时间格式。

答案 1 :(得分:1)

你在这里问2个问题

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

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

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

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

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

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