我将数据库中的所有日期保存为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);
}
}
我遇到的一些我不太热衷的选择包括:
使用moment和moment.timezone以客户端大小进行转换 - 我已经尝试了这个并且它不可靠,因为我不得不使用此代码来补偿看似有时工作的DST,以及其他它没有,所以有时时间是正确的时间是一小时前进,但实际上我并不热衷于在这里处理它,所以我最好继续这种方法:
var tz = jstz.determine();
var m = moment(value).tz(tz.name());
return m.add(m.isDST() ? 1 : 0, 'hours');
使用适当的偏移量手动调整每个DateTime对象 - 当然这是最后的手段?!我的意思是每次将DateTime对象设置为附加偏移量
自定义JSON序列化程序,以便在从WebApi2(或接收它)时返回响应时静默转换DateTime。我认为&#34;这种全局方法是最好的,因为我在很多不同的模型中都有DateTime对象,并且当前都在客户端呈现为UTC(ASP.Net MVC应用程序)。我需要在传递之前调整这个DateTime,因为它正在使用UTC日期进行反序列化(正确或错误是正在发生的事情)
我很想实现选项3.我已经将客户端的本地时区作为偏移量(01:00,02:00等)。我对如何自定义序列化器以及在何处进行操作感到困惑。
非常感谢任何帮助