我有一个ASP.NET MVC应用程序,它以UTC格式存储所有SQL DateTime,因此无论客户端从哪个时区访问该站点,时间都是一致的。
现在,我想向用户重新显示正确的时间,所以每当我在我使用的视图中显示时间时:
timeVariable.ToLocalTime();
但是,。ToLocalTime()基于服务器,而不是客户端。
我是否需要在客户端的JavaScript中处理此问题?
我可能会将时区作为请求的一部分传递,并让控制器处理该事件,但我假设有更好的方法来执行此操作。或者不存在?
提前感谢您的帮助!
-Matt
答案 0 :(得分:12)
对于Asp.Net MVC + jQuery,我已经创建了一个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:Views \ Shared \ DisplayTemplates \ UTCTime.cshtml
@model DateTime
<span class="UTCTime">@Model</span>
添加到Views \ Shared_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>
当然要清理它,它有点冗长,所以你可以看到发生了什么。
答案 1 :(得分:6)
我见过的几乎所有将时间转换为当地时间的网站都要求用户在创建帐户时指定自己的时区。 Gmail就是一个例子,但还有很多其他例子。
我发现很多尝试在IP地址上使用javascript或反向查找的解决方案都容易出现故障和边缘情况。
答案 2 :(得分:3)
除了德里克的回答, &#34;追加&#39; UTC&#39;在将其转换为javascript中的日期之前将其转换为字符串。&#34; Convert UTC date time to local date time using JavaScript
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>