DateTime.现在可靠的一个供将来使用

本文关键字:一个 将来 DateTime | 更新日期: 2023-09-27 18:18:38

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

在我的应用程序中,我曾经将Datetime保存为DateTime.Now,以标识用户上次访问,上次登录和许多其他目的。

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

我得到了异常在所有区域,我用来检索Datetime从Sqlite数据库并使用Convert.ToDateTime("[retrived DB value]");转换为Datetime

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

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

独立于系统Datetime文化的标准方法是什么?什么好主意吗?

注意:我在DB中使用的保存datatimetime值的字段是"NTEXT"格式。

DateTime.现在可靠的一个供将来使用

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

检索时可以解析为:

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);

标准实践应该是,to/from存储在不变文化中。当你想要显示时,这是你从不变量转换到用户UI区域设置的地方。

也查看这个链接,它将帮助你在短期内解决问题。也就是在连接字符串中指定日期时间格式

你问了两个问题

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

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

如果你想有一个共同的日期来链接在同一时间发生的事件,你应该总是使用相同的源机器,通常是服务器来获得正确的时间,因为你不希望人们能够改变他们的机器上的时间,破坏系统

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

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

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

之前转换为UTC