首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >json和Utc日期时间

json和Utc日期时间
EN

Stack Overflow用户
提问于 2013-03-31 08:33:55
回答 2查看 22.8K关注 0票数 5

我将Utc日期时间存储在服务器上,并通过json请求数据以显示在客户端。问题是服务器按其时区返回时间,这与客户端不同。如何在不对偏移量进行硬编码的情况下将本地dateTime显示在客户端?

我使用SQL Server2008数据库中的asp.net mvc和存储日期和时间作为'datetime‘。数据库中DateTime格式为2013-03-29 08:00:00.000。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-31 10:02:08

您没有说明UTC时间是如何表示的。通常使用的UNIX时间值是1970-01-01T00:00:00Z以来的秒数。如果这就是您正在使用的,您可以在客户机上创建一个date对象,方法是乘以1,000并将其提供给Date构造函数:

代码语言:javascript
运行
复制
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构造函数:

代码语言:javascript
运行
复制
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 (假设协调世界时),则可以使用:

代码语言:javascript
运行
复制
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

对不起,一定是贴错了剪贴画,匆忙去开会了。

代码语言:javascript
运行
复制
// 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)
票数 6
EN

Stack Overflow用户

发布于 2013-03-31 08:59:40

以UTC的形式返回DateTime,并在客户端使用.toLocaleString()进行转换:

代码语言:javascript
运行
复制
  @ViewBag.Time = Model.Time.ToUniversalTime().Ticks / TimeSpan.TicksPerMillisecond

  <script>
       var time = new Date(@ViewBag.Time);
       var localTimeString = time.toLocaleString();
       alert(localTimeString);
  </script>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15725090

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档