c# - 将 UTC 日期存储在 Visual Studio 设置文件中

标签 c# datetime visual-studio-2013

以下是我在 C# 中使用的设置的一些片段:

设置.settings

<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 属性并确保它是 来检查传递给它的日期是否为 UTC。 DateTimeKind.Utc。但是,通过调用 Settings.Default.SomeSettingUtcDate 返回的日期将不会设置此属性。

为了满足调用方法中的检查,创建一个具有 UTC 类型集的新 DateTime 对象似乎是一种黑客行为,因为使用 UTC 日期的大部分目的是让每个人都知道就事情何时真正发生达成一致,并促使人们思考时间并在第一时间就把事情做好。如果我们从设置文件中获取任何旧的日期值并假设它毕竟是 UTC,那么在我看来,我们也可以不检查 Kind 是否为 Utc,因为设置文件中不必如此。

由于我的方法可以使用另一个日期(而不是设置文件中的日期)调用,因此检查 UTC 类型仍然有值(value),所以我如何才能缩小这一差距并使我和其他开发人员更容易“落入成功的深渊”,日期存储在设置文件中?

有没有办法通过不同的日期时间对象指定 UTC(因此至少日期被假定为 UTC,并且在编辑设置时在 GUI 中明显显示一些指示符,例如它是例如 UtcDateTime),或者在日期字符串本身中指定 UTC?

最佳答案

Kind 未在设置文件中序列化,因此反序列化时无法取回它。最好的选择可能是使用 DateTimeOffset 而不是 DateTimeDateTimeOffset 嵌入时区信息,该信息包含在其字符串表示形式中,因此如果序列化 UTC 日期,则反序列化时将获得 UTC 日期。

(注意:DateTimeOffset 不会出现在设置设计器的类型下拉列表中,因此您必须从列表末尾的“浏览...”条目中手动选择它;它位于 mscorlib/System 下)

关于c# - 将 UTC 日期存储在 Visual Studio 设置文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26790529/

相关文章:

c# - Vici coolstorage 文本字段在 WP7 应用程序中未正确显示(某些字符丢失)

mysql - 使用 DATEADD 从数据库中删除记录的 SQL 问题

php - 两个日期之间的差异(以分钟为单位,不包括周末和节假日)

r - R中的日期时间转换错误-重复的第一时间点

visual-studio-2013 - Visual Studio 数据库项目重命名列

c++ - linux + Visual Studio 2013 + VisualGDB, undefined reference 'dlopen'

c# - VS2015 project.json 编译排除

c# - 如何从 Base Controller 中的 OnActionExecuting 重定向?

c# - 命名空间 'OData' 中不存在类型或命名空间 'Microsoft.AspNetCore'

c# - TreeListView 在添加子项后以编程方式展开节点