2016-02-23 38 views
1

我正在像一个AJAX请求如下:当转换一个JSON日期时间为JavaScript日期它显示1天低于当地时区以前

$.ajax({ 
    type: 'POST', 
    url: '@Url.Action("GetExpirationDates", "Products")', 
    data: data, 
    dataType: 'json', 
    success: function (data) { 
    var dateArray = data.map(function (date) { 
     var d = new Date(date); 
     return d.toLocaleDateString(); 
    }); 
}); 

这里是data看起来喜欢:

2016-02-25T00:00:00,2016-03-25T00:00:00,2016-04-25T00:00:00

看来,只要我做new Date(date)每一个这些日期取决于具有显示的机会,因为

2016年2月24日,2016年3月24日,2016年4月24日

(一天少于它应该是)什么当地时间是。我知道这很可能是由于JavaScript处理时区的方式。我想知道如何去解决它。

+1

我建议[moment.js](http://momentjs.com/)更容易处理日期。时区问题和许多其他事情更加优雅地处理。另一个黑客将是每个日期增加12个小时。 – ryanyuyu

+0

+1为moment.js。还阅读UTC日期时间处理,以帮助各种各样的复杂性。 http://stackoverflow.com/questions/9756120/how-do-i-get-a-utc-timestamp-in-javascript https://en.wikipedia.org/wiki/Coordinated_Universal_Time –

回答

2

这取决于你想如何消费最终结果。 一个简单的例子是:

var d = new Date("2016-02-25T00:00:00"); 
d.getDate(); //returns 24 because my timezone is -06:00. 
d.getUTCDate(); //returns 25, the UTC day of the month 

同样可以得到月完成/ getUTCMonth

我真的会建议使用时刻。在哪里它就像

moment("2016-02-25T00:00:00").format("MM/DD/YYYY"); //returns "02/25/2016" 

它可以更好地控制UTC和格式化字符串。

+0

那么,我该如何从: var d = new Date(“2016-02-25T00:00:00”);格式化日期字符串为“2/25/2016”? –

+0

我来找我做下面的事情:这真的是要做的吗? (d.getMonth()+ 1)+'/'+ d.getUTCDate()+'/'+ d.getFullYear() –

+0

Javascript并没有真正的字符串格式化功能。另外,如果使用toUTCDate,请确保使用toUTCMonth和toUTCFullYear,否则您的月/年可能会在月底/开始附近的日期关闭。 我真的推荐使用Moment.js,如果你想使用日期很多。 http://momentjs.com/ – comwizz2

0

给这一个镜头:

function getNow() { 
    var date = new Date(), 
     y = date.getFullYear(), 
     mo = date.getMonth() + 1, 
     d = date.getDate(), 
     h = date.getHours(), 
     m = date.getMinutes(), 
     s = date.getSeconds(); 

    date.setDate(date.getDate()); 
    mo = (mo < 10 ? '0' : '') + mo; 
    d = (d < 10 ? '0' : '') + d; 
    h = (h < 10 ? '0' : '') + h; 
    m = (m < 10 ? '0' : '') + m; 
    s = (s < 10 ? '0' : '') + s; 

    return h + ':' + m + ':' + s + ' - ' + mo + '/' + d + '/' + y; 
} 
0

如果不指定使用ISO8601日期字符串时UTC偏移,浏览器会假定日期是UTC。

将此表示为区域设置日期字符串将根据您的时区应用偏移量。

如果你想获得UTC日期,你可以使用

return d.toUTCString(); 

或者,如果你有超过JSON的服务控制,您可以指定日期属于在ISO字符串时区。

例如,UTC - 7小时将表示为。

2016-02-25T00:00:00-0700,2016-03-25T00:00:00-0700,2016-04-25T00:00:00-0700

如果本地时区是UTC - 7小时,d。的toLocaleString将正确地显示为

2016年2月25日,2016年3月25日,2016年4月25日

+0

我发现最好让服务始终返回并接受UTC日期。让客户端JavaScript将时间转换为本地时区并回到UTC。 –

+0

那么我怎样才能得到像2/23/2016这样的格式的本地日期字符串?它会像新的日期(date.toLocaleString()); ? –

相关问题