我正在比较DateTime类型的两个变量,比如说d1
和d2
,它们看似相等但比较函数返回1
而不是0
。打印的值均为12/10/2015 9:44:52 AM
d1
是lastModified,文件的DateTime属性,在文件中保存为字符串s1
。
String s1 = d1.ToUniversalTime().ToString();
稍后将该文件作为
读取DateTime d2 = DateTime.Parse(s1) ;
两个日期之间的比较奇怪地不是预期的零,因为它们相等,使用以下
DateTime.Compare(d1.ToUniversalTime(),d2)
如果我在将它们转换为字符串之后对d1和d2进行字符串比较,则它们相等并且都打印上述值。
我一直在努力找出为什么当日期作为字符串保存到文件并再次阅读以更改为日期时不匹配。
答案 0 :(得分:1)
我想我找到了它。让我们逐行看看。
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()
方法来生成它们的字符串表示,这个方法使用The "G"
standard format specifier进行无参数重载,据我所知,这个说明符并不代表任何文化的毫秒部分。
如果您在f
方法中使用了一些ff
,fff
,ToString()
...日期和时间说明符,我确定您会看到不同的结果作为他们的陈述。
答案 1 :(得分:0)
您必须使用round trip format specifier "o"
转换为您的可持久字符串,否则您将失去毫秒。
String s1 = d1.ToUniversalTime().ToString("o");
另外,为了安全起见,我会使用InvariantCulture来解析它(如果您的线程文化总是英语,可能没有必要)。
DateTime d2 = DateTime.Parse(s1, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind);
- 编辑 - 按照MSDN上的建议使用DateTimeStyles.RoundtripKind
进行解析。