2017-04-19 147 views
16

我试图将一些数据发布到具有日期的REST API中。 现在当我调试,我的日期参数是与我的时区正确日期JS Date对象:Tue Apr 04 2017 00:00:00 GMT+0530

后离开我的代码,我看到网络选项卡中的相同,则转换为UTC日期:"2017-04-03T18:30:00.000Z"

我搜索的解决方案,根据该我需要包括的角区域的文件在我的index.html,我做到了:

<script type="text/javascript" src="resources/js/angular/angular-locale_en-in.js"></script> 

,但它并不能帮助。 我见过像添加日期格式的过滤器或其他解决方案,但我想要一个全局解决方案。 有什么帮助吗? 谢谢:)

+1

不清楚具体问题是什么或者你想改变什么 – charlietfl

+1

我在我的用户界面上选择4月4日,服务器在UTC时间4月3日。我的休息apis是第三方,不能改变它们。 我想要全局处理这个问题 – pranavjindal999

+1

但是当你将utc转换回本地将是相同的。4月4日。仍然不清楚 – charlietfl

回答

2

金达尔萨博,它会这样工作。当我们用日期选择器选择任何日期或只是传递任何值时,它将采用原始本地日期,但当我们将该值进一步传递给它时,它会将其转换为UTC,之后它需要在接收端再次转换为本地区域。数据库以UTC格式保存日期时间。

3

与charlietfl建议的一样,全局攻击可能是重写Date.prototype.toJSON()方法,但这不是一个好习惯。

你在哪里使用$ http.post调用?提交$ http请求的最佳位置将在服务中。如果你使用服务,那么我建议你包装你的公共服务API,这样你就可以拥有“公共”和“私人”方法:这些方法可以用于执行常见操作,如数据转换,验证等。

angular.service('bookStoreService', ['$http'], function($http) { 
    var normalizeBooks = function(booksArray){ 
     booksArray.forEach(function(book){ 
      // do something on the book 
     }); 
    }; 

    var updateBooks = function(books){ 
     normalizeBooks(books); 
     $http.post('myurl', books); 
    }; 

    return { 
     updateBooks : updateBooks 
    }; 
}); 
+1

这就是我不想做的事情。我只是希望在发布时不要做这些转换。 – pranavjindal999

+1

然后,$ http拦截器是您的解决方案 –

+0

请阅读“转换请求和响应”一节:https://docs.angularjs.org/api/ng/service/$http –

2

您是否已将angular-locale_en-in.js库添加到您的应用程序中?事情是这样的....

angular.module('myAngularApp', [ 
    'ngLocale']) 

否则,JS库将不会在你的角度应用程序的任何影响。

+0

是的,我确实注入了相同的 – pranavjindal999

9

处理日期,时间和时区也让我感到困惑。可能是这个答案给你一些关于你如何处理它们的见解。

尝试在Chrome的开发者控制台下面的代码,看看日期同一如何以不同的格式呈现:

var date = new Date(); 
date.toISOString(); // "2017-04-29T09:54:28.714Z" 
date.toGMTString(); //"Sat, 29 Apr 2017 09:54:28 GMT" 
date.toLocalString(); //"4/29/2017, 3:24:28 PM" 

您在客户端创建的任何日期总是记录为零时区,即UTC+/-00:00 Z偏移的日期。为了简单起见,您可能认为UTC和GMT相同。当涉及到显示目的时,根据浏览器的时区显示同一日期。如果你做console.log (date)它会输出Sat Apr 29 2017 15:24:28 GMT+0530 (IST)但这并不意味着日期的内部记录是按照浏览器的时区。它只是按照浏览器的时区显示在屏幕上/控制台上。

查看日期表示不是从一个时区转换到另一个时区,而是将它们视为同一日期的不同表示。在您的浏览器中,它被表示为GMT+0530偏移量,并且当它被发送到服务器时,它是在零时区偏移量处的相同日期。

根据您的意见,如果您在GMT + 0530时区选择4月4日00:00 AM,那么在内部它将在GMT + 0,即零时区偏移量的4月3日18:30 PM。让它按照原样进入服务器。当你需要使用这个日期时,它将在4月3日从服务器返回,并且它将按照浏览器的时区偏移量显示在浏览器中。不涉及转换,它是具有不同表示的一个日期。

我曾问过一个related question,可能是这个增加了更多的说明。

总的来说,这个答案与@geminiousgoel和@charlietfl的答案相同。

3

场景:

发送日期从UIAPI callepoch time(UNIX时间),而不是date字符串。您可以使用getTime()方法将日期转换为纪元时间。

var dateStr = "Tue Apr 04 2017 00:00:00 GMT+0530"; 
 

 
var dateEpoch = new Date(dateStr).getTime(); 
 

 
console.log(dateEpoch); // 1491244200000 (Local Time)

在接收器端,他们有这个epoch time(UNIX时间)转换成Date again.It将给予相同的本地日期\时间从UI通过。

样品截图 enter image description here

+0

谢谢为你的答案,但没有帮助。我无法控制API。 – pranavjindal999

+0

我在说,API团队应该在他们的最后处理。 –

+0

是的,这就是我说的.. API团队是第三方..我没有控制API ..我不知何故需要一个全球性的解决方案,以便我选择的日期是在服务器发送日期 – pranavjindal999

4

传递UTC日期到服务器所需的行为。客户端API应该处理UTC时间,而不是假定日期都是本地日期。

但无论如何,您可以根据当地时区将日期转换为字符串,并将该字符串传递给服务器。

+0

好主意@达达 – Anas

3

我想你可以将它作为字符串(如果你使用接受字符串的API)以你需要的格式传递,比如说“2017年4月4日00:00:00 GMT + 0530”并将其保存在后台,以字符串结尾,然后当您检索它时,它将是字符串,因此不会以任何方式进行更改。

0

追加UTC末,使浏览器将其转换为UTC日期

var dateToServer =new Date(dateFromUser+" UTC"); 现在dateToServer将UTC DateTime格式。