Asp.net mvc 在MVC中,使用Json传输具有时间格式属性的对象,如何避免自动减少8小时?

Asp.net mvc 在MVC中,使用Json传输具有时间格式属性的对象,如何避免自动减少8小时?,asp.net-mvc,asp.net-mvc-3,asp.net-mvc-4,Asp.net Mvc,Asp.net Mvc 3,Asp.net Mvc 4,学生班有一个叫做生日的属性。我的web服务器在北京(UTC+8),当我从服务器获取JSON格式的数据时,生日属性总是比原始日期缩短8小时,我如何更正?我也在北京,我为所有生日酒店增加了8个小时,但如果我在另一个时区或web服务器不在北京,那么我必须手动添加其他时间 在web服务器上,以下是我的代码: return Json(student); 获取数据的代码: var studentReader= new StreamReader(Request.InputStream); v

学生班有一个叫做生日的属性。我的web服务器在北京(UTC+8),当我从服务器获取JSON格式的数据时,生日属性总是比原始日期缩短8小时,我如何更正?我也在北京,我为所有生日酒店增加了8个小时,但如果我在另一个时区或web服务器不在北京,那么我必须手动添加其他时间

在web服务器上,以下是我的代码:

    return Json(student);
获取数据的代码:

  var studentReader= new StreamReader(Request.InputStream);
  var student= JsonHelper.FromJson<Student>(studentReader.ReadToEnd());
var studentReader=newstreamreader(Request.InputStream);
var student=JsonHelper.FromJson(studentReader.ReadToEnd());
JsonHelper类:

   public static T FromJson<T>(this string json)
    {
     return JsonConvert.DeserializeObject<T>(json);
    }
publicstatict FromJson(这个字符串是json)
{
返回JsonConvert.DeserializeObject(json);
}

建议您将所有日期时间值存储在UTC中。在客户端代码中,您可以将其转换为所需的任何时区。

建议您将所有日期时间值存储为UTC。在客户端代码中,您可以将其转换为您想要的任何时区。

您的JSON序列化很好。没问题

您需要确保将所有日期时间值存储为UTC。当你显示日期时,你可以转换到你需要的时区

我通常是这样做的:

  • 每次存储DateTime时,我都使用DateTime.ToUniversalTime()确保将日期存储在数据库的UTC上
  • 当我需要在视图中打印日期时,我使用了一种方法,该方法采用特定的时区并转换日期。参见下面的代码示例
  • 我从不依赖客户端区域。如果我的用户范围广泛,来自我刚才提到的许多地理位置,那么请选择他们喜欢的时区,并将这些信息存储在他们的个人资料中(Google、Microsoft和37Signals都为他们的web应用程序这样做,举几个例子)

关于先前问题和问题的更多信息


编辑:

您的JSON序列化很好。没问题

您需要确保将所有日期时间值存储为UTC。当你显示日期时,你可以转换到你需要的时区

我通常是这样做的:

  • 每次存储DateTime时,我都使用DateTime.ToUniversalTime()确保将日期存储在数据库的UTC上
  • 当我需要在视图中打印日期时,我使用了一种方法,该方法采用特定的时区并转换日期。参见下面的代码示例
  • 我从不依赖客户端区域。如果我的用户范围广泛,来自我刚才提到的许多地理位置,那么请选择他们喜欢的时区,并将这些信息存储在他们的个人资料中(Google、Microsoft和37Signals都为他们的web应用程序这样做,举几个例子)

关于先前问题和问题的更多信息


编辑:

在返回JSON之前,您能告诉我如何将中的日期转换为UTC日期吗?现在我直接从数据库中读取birhday并返回JSON。如果我在UTC+9,我是否应该添加9小时?有两种方法:DateTime.ToUniversalTime或TimeZoneInfo.ConvertFromUtc(…)(您可以从上面的答案中看到。但最重要的是,您需要知道保存在数据库中的datetime的时区。保存在数据库中的datetime值首先应设计为保存在UTC中。这里有一个关于时区的很好的讨论:在时间上对任何“瞬间”使用UTC是好的(例如“LastModified”).然而,当日期代表完全与时区无关的事物(如生日或周年纪念日)时,这会导致问题。这些值应该始终显示相同的值,并且独立于最终用户时区。您能告诉我如何在返回JSON之前将日期转换为UTC日期吗?现在我直接从数据库读取birhday并返回JSON。如果我是UTC+9,我是否应该添加9小时?有两种方法:DateTime.ToUniversalTime或TimeZoneInfo.ConvertFromUtc(…)(您可以从上面的答案中看到。但最重要的是,您需要知道保存在数据库中的datetime的时区。保存在数据库中的datetime值首先应该设计为保存在UTC中。这里有一个关于时区的很好的讨论:在时间上的任何“瞬间”使用UTC都是好的(例如“LastModified”)。但是,当日期表示完全与时区无关的内容时(例如生日或周年纪念日),这会导致问题。这些值应始终显示相同的值,并且独立于最终用户时区。您的意思是服务器应存储utc时间格式,客户端在到达生日时,应根据其timezime将其转换为loacla时间格式。我检查了我的数据库,生日值如“2013-05-28 00:31:00.000”,似乎与utc格式;如果我的服务器时间不是utc格式,我想更改为依靠clinet web brower的时间,可以吗?例如,服务器在北京(utc+8),如果我在utc+8时区,我得到数据并加上8小时,如果我在utc+7时区,我得到数据并加上7小时。还有一个问题,如果web服务器在utc+9时区,比如东京,而我在utc+7时区,我是加上7小时还是9小时?据我所知,我的数据库的生日不是utc格式,我的web服务器在北京(utc+8),我也在北京,每次我从服务器Json添加生日,我添加时区(表示8小时)手动操作,运行良好!不要依赖浏览器。大多数用户的设置都不正确。让用户选择他/她所在的时区,并将该值存储在每个用户配置文件的数据库中。然后根据每个用户希望看到的日期设置日期。这意味着服务器应存储utc时间格式,当到达bir时,客户端应存储utc时间格式这一天,它应该转变为它的loacla时间
public static DateTime ToLocalTimeZone(this object date)
{        
    DateTime dt;

    if (!DateTime.TryParse(date.ToString(), out dt))
        return DateTime.UtcNow;

    //Timezone string. This can be stored on web.config
    //or on the user profile as well
    var timeZone = "Pacific SA Standard Time"; 

    var defaultTimeZone = TimeZoneInfo.FindSystemTimeZoneById(timeZone);
    var userTime = TimeZoneInfo.ConvertTimeFromUtc(dt, defaultTimeZone);

    return userTime;
}