2016-08-26 6 views
2

javascript 날짜를 만든 다음 stringify을 작성하고 서버로 보내면 두 가지 다른 날짜가 표시됩니다. stringified 날짜는 항상 하루 전입니다.Json Stringify 날짜가 자바 스크립트 날짜와 비교하여 잘못된 날짜를 생성합니다.

현재 내 javascript 날짜를 1 일씩 증가 시켜서 서버에서 같은 날짜를받습니다.

내 현재 코드 :

var dt = $(.datepicker).datepicker('getDate');//Fri Aug 26 2016 00:00:00 GMT+0200 (South Africa Standard Time) 
var result = Json.stringify(dt); //"2016-08-25T22:00:00.000Z" 

이 올바른 접근 방식인가, 아니면 내가 뭔가를 놓친 거지?

+0

'dt '의 내용은 무엇이고'result'의 결과는 무엇입니까? – Guy

+1

''내 자바 스크립트 날짜를 1 일씩 늘리십시오. '- 좋은 방법은 아닙니다. UTC 일과 하루가 다른 날에 시도해보십시오. 그런 다음이 문제를 극복하려고 시도한 라이브러리를 살펴보십시오. .. 날짜는 모든 언어의 모든 프로그래머를위한 뒷부분의 고통입니다. p –

+0

클라이언트와 서버가 동일한 시간대에 있는지 확인하십시오. –

답변

2

이것은 Date의 시간대 구성 요소 때문이다. 내가 한 주위에 작업이었다 :

var date = $(.datepicker).datepicker('getDate'); 
var utcDate = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes())) 
var result = Json.stringify(utcDate); 

(가) 시간대 구성 요소를 제거합니다.

+0

감사합니다. – JustLearning

+0

당신은 이런 식으로 진행되는 부정확 한 애플리케이션으로 끝날 것입니다. – Xotic750

+0

@ Xotic750, 이유를 설명하고 해결책을 제안 할 수 있습니까? – JustLearning

0

사용이

var result = Json.stringify(dt.toISOString()); 
+0

isostring : YYYY-MM-DDTHH : mm : ss.sssZ <- Z (줄 루어)는 시간대 (UTC와 동일한 시간대, 다른 이름)로 간주됩니다. – wazz

+0

자세한 내용을 편집하십시오.코드 전용 및 "시도하십시오"답변은 검색 가능한 콘텐츠가 없으므로 권장하지 않으며 누군가가 "시도해"야하는 이유를 설명하지 않습니다. – abarisone

1

귀하의 datetimes가 실제로 동일하고 정확하다는 것을 이해하지 못하는 것 같습니다. 서버로 전송 된 것을 수동으로 변경해야한다고 생각하는 이유를 설명하지 않았습니다. 다음은 실제로 동일하다는 것을 보여주는 예제입니다. 다른 형식으로 다른 timezones으로 표시되었습니다.

// Values from the local datetime string 
 
var local = { 
 
    year: 2016, 
 
    month: 7, 
 
    day: 26, 
 
    hours: 0, 
 
    minutes: 0, 
 
    seconds: 0, 
 
    milliseconds: 0 
 
}; 
 

 
// Values from the UTC ISO 8601 datetime string 
 
var utc = { 
 
    year: 2016, 
 
    month: 7, 
 
    day: 25, 
 
    hours: 22, 
 
    minutes: 0, 
 
    seconds: 0, 
 
    milliseconds: 0 
 
}; 
 

 
// Create Date object as local 
 
var date1 = new Date(
 
    local.year, 
 
    local.month, 
 
    local.day, 
 
    local.hours, 
 
    local.minutes, 
 
    local.seconds, 
 
    local.milliseconds 
 
); 
 

 
// Create Date object as local from UTC 
 
var date2 = new Date(Date.UTC(
 
    utc.year, 
 
    utc.month, 
 
    utc.day, 
 
    utc.hours, 
 
    utc.minutes, 
 
    utc.seconds, 
 
    utc.milliseconds 
 
)); 
 

 
var pre = document.getElementById('out'); 
 
// Display Date1 as local 
 
pre.appendChild(document.createTextNode(date1.toString() + '\n')); 
 
// Display Date2 as local 
 
pre.appendChild(document.createTextNode(date2.toString() + '\n')); 
 
// Display Date2 as UTC 
 
pre.appendChild(document.createTextNode(date2.toUTCString() + '\n')); 
 
// Test if Date1 and Date2 display the same datetime 
 
pre.appendChild(document.createTextNode(
 
    'Date1 === Date2: ' + (date1.getTime() === date2.getTime()) 
 
));
<pre id="out"></pre>

는 JSON은 (사양에 의한) ISO 8601에 Date 객체로 변환하지만, 이제 당신이 선택한 솔루션을 사용하는 경우 어떻게되는지 보자.

// Values from the local datetime string 
 
var local = { 
 
    year: 2016, 
 
    month: 7, 
 
    day: 26, 
 
    hours: 0, 
 
    minutes: 0, 
 
    seconds: 0, 
 
    milliseconds: 0 
 
}; 
 

 
// Create Date object as local 
 
var date = new Date(
 
    local.year, 
 
    local.month, 
 
    local.day, 
 
    local.hours, 
 
    local.minutes, 
 
    local.seconds, 
 
    local.milliseconds 
 
); 
 

 
// Your solution 
 
var utcDate = new Date(Date.UTC(
 
    date.getFullYear(), 
 
    date.getMonth(), 
 
    date.getDate(), 
 
    date.getHours(), 
 
    date.getMinutes())); 
 

 
var pre = document.getElementById('out'); 
 
// Display Date as local format 
 
pre.appendChild(document.createTextNode(date.toString() + '\n')); 
 
// Display utcDate as local format 
 
pre.appendChild(document.createTextNode(utcDate.toString() + '\n')); 
 
// Test if Date and utcDate display the same datetime 
 
pre.appendChild(document.createTextNode(
 
    'Date1 === Date2: ' + (date.getTime() === utcDate.getTime()) 
 
));
<pre id="out"></pre>

당신은 더 이상 동일 2 날짜와 끝까지. 날짜 시간의 전송 및 저장에 대해 ISO 8601을 좋아하지 않으십니까? 대체 방법으로는 신기원 (getTime) 이후 밀리 초 수 (UTC)를 사용하는 것이 좋습니다. JSON은 replacer 함수를 사용하지 않고 ISO 8601 대신이 변환을 수행 할 수 없습니다. 따라서 JSON.stringify을 사용하기 전에 변환이 필요합니다. 그래서 당신은 정말로 당신이 무엇을 성취하려고하는지 설명하고 왜 당신이 지금 무엇을 잘못 생각하고 있는지 설명 할 필요가 있습니다.

관련 문제