我将Utc日期时间存储在服务器上,并通过json请求数据以显示在客户端。问题是服务器按其时区返回时间,这与客户端不同。如何在不对偏移量进行硬编码的情况下将本地dateTime显示在客户端?
我使用SQL Server2008数据库中的asp.net mvc和存储日期和时间作为'datetime‘。数据库中DateTime格式为2013-03-29 08:00:00.000。
发布于 2013-03-31 10:02:08
您没有说明UTC时间是如何表示的。通常使用的UNIX时间值是1970-01-01T00:00:00Z以来的秒数。如果这就是您正在使用的,您可以在客户机上创建一个date对象,方法是乘以1,000并将其提供给Date构造函数:
var unixTimeValue = '1364694508';
var clientDateObject = new Date(unixTimeValue * 1000);
如果你使用.NET,这个值可能已经是毫秒了,所以你不需要乘以1,000。你需要检查源代码,看看传递了什么值,如果它是一个时间值,使用的是哪个时期。
Javascript date对象基于与UNIX相同的time value,但使用毫秒。标准日期方法(getFullYear、getMonth、getDate等)将根据系统设置返回本地时区的值。协调控制方法(getUTCFullYear、getUTCMonth、getUTCDate等)同时返回UTC值。
因此,如果要传递时间值,请使用它在客户机上创建一个date对象,并使用标准方法读取值,这样就拥有了UTC时间值的本地等效值。
如果要传递像2013-03-31T14:32:22Z这样的datetime字符串,可以使用Date.UTC将其转换为date对象,将该字符串转换为时间值,然后将其传递给date构造函数:
function dateFromUTCString(s) {
s = s.split(/[-T:Z]/ig);
return new Date(Date.UTC(s[0], --s[1], s[2], s[3], s[4], s[5]));
}
var s = '2013-03-31T14:32:22Z';
alert(dateFromUTCString(s)); // Mon Apr 01 2013 00:32:22 GMT+1000 (EST)
如果您的输入字符串是不同的格式,则可能需要调整传递给Date.UTC的拆分模式和参数顺序。
编辑
如果字符串格式为2013-03-29 08:00:00.000 (假设协调世界时),则可以使用:
function dateFromUTCString(s) {
s = s.split(/[\D]/ig);
return new Date(Date.UTC(s[0], --s[1], s[2], s[3], s[4], s[5], s[6]||0));
}
var s = '2013-03-29 08:00:00.000';
alert(dateFromUTCString(s)); // Fri Mar 29 2013 18:00:00 GMT+1000 (EST)
但要注意额外的空格。您可能希望修剪任何前导空格或尾随空格,并确保日期和时间组件之间只有一个分隔。
编辑2
不要使用Date.parse。在ES5之前,它完全依赖于实现。现在,如果字符串符合ES5指定的类ISO8601格式,那么它就是部分标准化的。但这并不是所有使用的浏览器都支持的,所以不可靠,否则仍然依赖于实现。最好的解决方案(即适用于所有地方的解决方案)是手动解析给定的值。
如果格式类似于:"1364835180000-0700",那么你可以很容易地使用一个函数减去偏移量来获得UTC时间值,然后将其提供给date构造函数。我假设-0700意味着格林威治以西7小时(javascript时区偏移量有相反的意义,格林威治以西是+ve)。
编辑3
对不起,一定是贴错了剪贴画,匆忙去开会了。
// Where s is a time value with offset
function toDate(s) {
// Include factor to convert mins to ms in sign
var sign = s.indexOf('-') > -1? 6e4 : -6e4;
s = s.split(/[\+\-]/);
var l = s[1].length;
// Convert offset in milliseconds
var offset = sign*s[1].substring(l-2,l) + sign*s[1].substring(l-4, l-2)*60;
// Add offset to time value to get UTC and create date object
return new Date(+s[0] + offset);
}
var s = "1364835180000-0700"
alert(toDate(s)); // Tue Apr 02 2013 09:53:00 GMT+1000 (EST)
发布于 2013-03-31 08:59:40
以UTC的形式返回DateTime,并在客户端使用.toLocaleString()进行转换:
@ViewBag.Time = Model.Time.ToUniversalTime().Ticks / TimeSpan.TicksPerMillisecond
<script>
var time = new Date(@ViewBag.Time);
var localTimeString = time.toLocaleString();
alert(localTimeString);
</script>
https://stackoverflow.com/questions/15725090
复制相似问题