我正在使用SQLite开发桌面独立应用程序。
在我的应用程序中,我曾经将日期时间保存为DateTime.Now
,以便在用户上次访问,上次登录以及许多其他目的时保存身份。它对我有效。
现在的问题是当我从" M / d / yyyy"更改系统时间格式时到" d / M / yyyy"在机器里,每件事都搞砸了。
我在以前用于从Sqlite DB检索Datetime并使用Convert.ToDateTime("[retrived DB value]");
似乎Convert.ToDateTime
试图将Datetime从不同的文化转换为当前的文化。
我失败了我实现了设计,以错误的方式保存和检索DateTime。 。不确定。
这样做的标准方法是什么,独立于系统日期时间文化?有什么想法吗?
注意:我在DB中用来保存DatimeTime值的字段在" NTEXT"格式。
答案 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)
1现在是获取当前日期的可靠方法
DateTime.Now获取本地计算机上的当前本地时间,在许多情况下这很好,但是在任何涉及多台计算机的情况下,您应始终使用UtcNow的UTC日期,因为这会存储全局时间然后可以转换为机器正在使用它的本地时间。
此外,如果您尝试使用共同日期链接同时发生的事件,则应始终使用相同的源计算机,通常是服务器以获取正确的时间,因为您不希望人们能够改变他们机器上的时间并破坏系统
2为什么我在更改日期格式时会中断
这是因为你没有保存日期,你正在保存一个字符串,字符串日期完全没有意义,有关如何阅读(解析)它的说明,这要么必须自动查找系统(即文化)或手动指定,因为你永远无法确保2台机器使用相同的文化,然后自动查找它通常是一个非常糟糕的主意。
我建议更改您的数据库字段,以实际将日期保存为日期而不是文本,并在保存之前转换为UTC