【问题标题】:ASP.NET membership returning DateTime with Kind set to LocalASP.NET 成员返回 DateTime 并将 Kind 设置为 Local
【发布时间】:2013-05-29 18:24:02
【问题描述】:

我有一个使用 ASP.NET 默认成员提供程序的 MVC3 项目。我正在尝试在查看页面上显示用户的详细信息。当我这样做时

MembershipUser user = Membership.GetUser(id);

为了获取我将要显示的用户,所有的 DateTimes(CreationDate、LastActivityDate)都将 Kind 属性设置为 Local。

所有这些日期都以 UTC 时间保存在 SQL Server 数据库中,那么为什么它们会作为 Local 进入 MVC?它弄乱了我的时区转换,因为我希望服务器时间是 UTC。

您是否可以设置一些内容,以便从 GetUser 函数返回的用户在 DateTimeKind.Utc 中具有 DateTimes?

【问题讨论】:

    标签: .net datetime utc


    【解决方案1】:

    只需使用myDate.ToUniversalTime()

    如果您的意思是 DateTime 中的值实际上是 UTC 时间,但类型设置为 Local,那么您必须将其转换为 UTC。

    var myUtcDate = DateTime.SpecifyKind(myDate, DateTimeKind.Utc);
    

    不幸的是,这是 .NET DateTime 类和 SQL 的普遍问题,而不是 MVC 特有的问题。我不知道有什么方法可以通过设置 DateTimeKind.Utc 来获取 UTC 格式的 DateTime。

    您可能想阅读 John Skeets 对 DateTime 的咆哮。

    http://noda-time.blogspot.com/2011/08/what-wrong-with-datetime-anyway.html

    如果您需要经常使用它,一种选择是创建一个扩展方法来执行此操作。

    public static class DateTimeExtensions {
        public static DateTime MakeUtcKind(this DateTime dateTime) {
            return DateTime.SpecifyKind(dateTime, DateTimeKind.Utc);
        }
    }
    

    那么你可以简单地这样做:

    var createDate = Membership.GetUser(id).CreationDate.MakeUtcKind();
    

    【讨论】:

    • 这实际上会将他已经 UTC 时间再次转换为 UTC 时间,并打乱他的日期转换
    • @Kenneth - 也许我误解了,但他似乎在抱怨他的时间是在 LocalTime 而不是 UTC。
    • 是的,我也在考虑这个问题。我认为值实际上是 UTC,但种类是本地的。所以我想他要问的是,如何在不影响价值的情况下改变种类?无论如何,可能需要来自 OP 的一些澄清。
    • 嗯,完美!我实际上不得不查找SpecifyKind。我的印象是它实际上也转换了价值。我错了。
    • 是的,没错。时间是正确的 UTC 值,但 Kind 设置为 Local,所以当我尝试转换它时会出错。我尝试的第一件事是自己设置类型MembershipUser user = Membership.GetUser(id); user.CreationDate = DateTime.SpecifyKind(user.CreationDate, DateTimeKind.Utc);,但这甚至无法编译,因为 CreateDate 是只读的。
    猜你喜欢
    • 2014-09-20
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 2023-02-16
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 2022-11-23
    相关资源
    最近更新 更多