1

一个学生班级有一个名为生日的属性。我的网络服务器在北京(UTC+8),当我从服务器获取 JSON 格式的数据时,生日属性总是减少 8 小时到原始日期,我该如何纠正这个问题?我也在北京,我为所有生日属性添加了 8 小时,但如果我在另一个时区或网络服务器不在北京,那么我必须手动添加其他时间。

在网络服务器上,这是我的代码:

    return Json(student);

获取数据的代码:

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

JsonHelper 类:

   public static T FromJson<T>(this string json)
    {
     return JsonConvert.DeserializeObject<T>(json);
    }
4

2 回答 2

1

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

于 2013-05-26T08:33:29.173 回答
0

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

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

这是我通常的做法:

  • 每次存储 DateTime 时,我都会使用 DateTime.ToUniversalTime() 来确保日期以 UTC 格式存储在数据库中。
  • 当我需要在视图中打印日期时,我使用了一种方法,该方法采用特定的 TimeZone 并转换日期。请参阅下面的代码示例。
  • 我从不依赖客户端区域。如果我有来自许多地理点的广泛用户,那么选择他们喜欢的时区并将这些信息存储在他们的个人资料中(谷歌、微软和 37Signals 都为他们的 Web 应用程序执行此操作,仅举几个例子)。

    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;
    }
    

此处此处有关先前问题的更多信息

编辑: 此处允许的时区字符串列表

于 2013-05-26T15:54:56.733 回答