我有一个ASP。. NET MVC应用程序,存储所有SQL DateTime在UTC,所以时间是一致的,无论时区,客户端是打网站。
现在,我想重新显示正确的时间给用户,所以任何时候我在我的视图中显示时间,我使用:
timeVariable.ToLocalTime();
但是,. tolocaltime()是基于服务器的,而不是基于客户端的。
我需要在客户端JavaScript中处理这个吗?
我可能可以传递时区作为请求的一部分,并让控制器处理偏移,但我假设有更好的方法来做到这一点。或者没有?
提前感谢您的帮助!
马特
我已经创建了一个DisplayTemplate和脚本来帮助实现这一点。
模型类:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
public class SampleModelWithDate
{
[UIHint("UTCTime")]
[DataType(DataType.DateTime)]
public DateTime Date { get; set; }
}
DisplayTemplate:观点共享 DisplayTemplates UTCTime.cshtml
@model DateTime
<span class="UTCTime">@Model</span>
添加到ViewsShared_Layout。cshtml,或到您的视图:
<script>
$(function () {
// Determine timezone offset in milliseconds
// from: http://www.w3schools.com/jsref/jsref_getTimezoneOffset.asp
var d = new Date()
var offsetms = d.getTimezoneOffset() * 60 * 1000;
$('.UTCTime').each(function () {
try
{
var text = $(this).html();
var n = new Date(text);
n = new Date(n.valueOf() - offsetms);
$(this).html(n.toDateString() + " " + n.toLocaleTimeString());
$(this).attr("Converted from UTC " + text);
}
catch (ex) {
console.warn("Error converting time", ex);
}
});
});
</script>
把它整理一下当然,它有点冗长,这样你就可以看到发生了什么
我所见过的几乎所有将时间转换为当地时间的网站都要求用户在创建帐户时指定他或她的时区。Gmail是一个例子,但还有许多其他的。
我发现在IP地址上尝试使用javascript或反向查找的许多解决方案容易失败和边缘情况。
除了Derrick的回答,"在javascript中将字符串转换为日期之前,将'UTC'附加到字符串后面。"使用JavaScript将UTC日期时间转换为本地日期时间
UTCTime可以自动转换为本地时间。
<script>
$(function () {
var d = new Date()
$('.UTCTime').each(function () {
try
{
var text = $(this).html() + ' UTC'; //Append ' UTC'
var n = new Date(text);
$(this).html(n.toDateString() + " " + n.toLocaleTimeString());
$(this).attr("title", "Converted from UTC " + text);
}
catch (ex) {
console.warn("Error converting time", ex);
}
});
});
</script>