WebApi中的TimeZone转换

时间:2016-05-03 13:37:13

标签: c# asp.net timezone asp.net-web-api2 jsonserializer

我将数据库中的所有日期保存为UTC。我现在需要调整到客户端的本地时区。

一些背景知识。我正在使用WebApi2,我有一个消费它的ASP.Net MVC5网络应用程序。最终,原生应用程序也将使用WebApi2服务。

这是我用来获取和渲染的方法

protected async Task<T> GetAndParseApiResponse<T>(string url)
{
    T model = default(T);

    using (HttpClient client = GetHttpClient(SessionWrapper.AuthToken))
    {
        try
        {
            var response = await client.GetAsync(url)
                .ConfigureAwait(false);

            var formatter = new JsonMediaTypeFormatter
            {
                SerializerSettings = { TypeNameHandling = TypeNameHandling.Auto }
            };

            model = await response.Content.ReadAsAsync<T>(new List<MediaTypeFormatter> { formatter })
                .ConfigureAwait(false);
        }
        catch (Exception ex)
        {
            throw new Exception("An exception occured performing GET at " + url, ex);
        }
    }

我遇到的一些我不太热衷的选择包括:

  1. 使用momentmoment.timezone以客户端大小进行转换 - 我已经尝试了这个并且它不可靠,因为我不得不使用此代码来补偿看似有时工作的DST,以及其他它没有,所以有时时间是正确的时间是一小时前进,但实际上我并不热衷于在这里处理它,所以我最好继续这种方法:

    var tz = jstz.determine();
    var m = moment(value).tz(tz.name());
    return m.add(m.isDST() ? 1 : 0, 'hours');
    
  2. 使用适当的偏移量手动调整每个DateTime对象 - 当然这是最后的手段?!我的意思是每次将DateTime对象设置为附加偏移量

  3. 自定义JSON序列化程序,以便在从WebApi2(或接收它)时返回响应时静默转换DateTime。我认为&#34;这种全局方法是最好的,因为我在很多不同的模型中都有DateTime对象,并且当前都在客户端呈现为UTC(ASP.Net MVC应用程序)。我需要在传递之前调整这个DateTime,因为它正在使用UTC日期进行反序列化(正确或错误是正在发生的事情)

  4. 我很想实现选项3.我已经将客户端的本地时区作为偏移量(01:00,02:00等)。我对如何自定义序列化器以及在何处进行操作感到困惑。

    非常感谢任何帮助

0 个答案:

没有答案