日期时间类型的日期不匹配

本文关键字:日期 不匹配 类型 时间 | 更新日期: 2023-09-27 18:34:53

>我正在比较两个日期时间类型的变量,比如d1d2,它们看似相等,但比较函数返回1而不是0。为它们打印的值是12/10/2015 9:44:52 AM

d1是最后修改,文件的日期时间属性,该文件保存为字符串s1保存在文件中。

String s1 = d1.ToUniversalTime().ToString();

稍后将此文件读取为字符串时

DateTime d2 = DateTime.Parse(s1) ;

奇怪的是,两个日期之间的比较不像预期的那样为零,因为它们相等,使用以下

DateTime.Compare(d1.ToUniversalTime(),d2)

如果我在将 d1 和 d2 转换为字符串后将它们字符串进行比较,它们是相等的,并且都打印上述值。

我一直在努力找出为什么当日期保存为字符串到文件并再次读取以更改为日期时不匹配。

日期时间类型的日期不匹配

我想我找到了。让我们逐行查看。

String s1 = d1.ToUniversalTime().ToString();

使用该行,您可以生成12/10/2015 9:44:52 AM作为d1.ToUniversalTime()的字符串表示形式,而无需任何毫秒部分。

DateTime d2 = DateTime.Parse(s1) ;

使用该行,您将此字符串解析为 DateTime 12/10/2015 9:44:52 作为一个值,但它的毫秒部分将为零。

这就是为什么你的d1.ToUniversalTime()总是大于dt2,从方法返回大于零的值太正常DateTime.Compare

如果我在将 d1 和 d2 转换为字符串后将它们进行比较, 它们是相等的,并且都打印上述值。

我假设您使用ToString()方法来生成它们的字符串表示,此方法使用 "G" 标准格式说明符进行无参数重载,据我所知,此说明符并不代表任何文化的毫秒部分。

如果你使用一些ffffff...日期和时间说明符 在您的ToString()方法中,我很确定您会看到不同的结果作为它们的表示形式。

您必须

使用往返格式说明符"o"转换为持久字符串,否则会丢失毫秒数。

String s1 = d1.ToUniversalTime().ToString("o");

另外,为了安全起见,我会使用InvariantCulture来解析它(如果您的线程区域性始终是英语,则可能没有必要(。

DateTime d2 = DateTime.Parse(s1, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind);

小提琴

--

编辑 -- 按照 MSDN 的建议使用 DateTimeStyles.RoundtripKind 进行分析。