将UTC日期存储在Visual Studio设置文件中
本文关键字:Studio 设置 文件 Visual UTC 日期 存储 | 更新日期: 2023-09-27 18:29:33
以下是我在C#中使用的设置的一些片段:
设置。设置
<Setting Name="SomeSettingUtcDate" Type="System.DateTime" Scope="Application">
<Value Profile="(Default)">10/27/2014 12:00:00</Value>
</Setting>
Settings.Designer.cs
[global::System.Configuration.ApplicationScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("11/6/2014 12:00:00")]
public global::System.DateTime SomeSettingUtcDate {
get {
return ((global::System.DateTime)(this["SomeSettingUtcDate"]));
}
}
正如你从名字中看到的,我希望日期是UTC时间。在我的用例中,接受日期的方法将通过检查DateTime.Kind
属性并确保其为DateTimeKind.Utc
来检查传递给它的日期是否为UTC。但是,调用Settings.Default.SomeSettingUtcDate
返回的日期不会设置此属性。
创建一个设置了UTC类型的新DateTime
对象,以满足对所调用方法的检查,这似乎是一种黑客行为,因为使用UTC日期的大部分目的是让每个人都能就事情实际发生的时间达成一致,并促使人们思考时间,第一次就把事情做好。如果我们从设置文件中获取任何旧的日期值,并假设它毕竟是UTC,那么在我看来,我们还不如不检查Kind
是否是Utc
,因为在设置文件中不必这样。
由于我的方法可以用另一个日期(而不是设置文件中的日期)调用,因此检查UTC类型仍然有价值,那么我如何缩小这一差距,让我和其他开发人员更容易用设置文件中存储的日期"陷入成功的深渊"呢?
有没有一种方法可以通过不同的日期-时间对象指定UTC(因此,至少日期被假定为UTC,并且在编辑设置时在GUI中明显显示一些指示符,例如它是UtcDateTime),或者在日期字符串本身中指定UTC?
Kind
在设置文件中没有序列化,因此在反序列化时无法将其取回。最好的选择可能是使用DateTimeOffset
而不是DateTime
;DateTimeOffset
嵌入时区信息,该信息包含在其字符串表示中,因此,如果序列化UTC日期,则在反序列化时将获得UTC日期。
(注意:DateTimeOffset
不会出现在设置设计器的类型下拉列表中,因此您必须从列表末尾的"浏览…"条目中手动选择它;它位于mscorlib/System下)