문제

JavaScript의 내 날짜 개체는 내가 위치한 위치 때문에 항상 UTC +2로 표시됩니다. 따라서 이렇게

Mon Sep 28 10:00:00 UTC+0200 2009

문제는 JSON.stringify 위 날짜를 변환합니다

2009-09-28T08:00:00Z  (notice 2 hours missing i.e. 8 instead of 10)

내가 필요로하는 것은 날짜와 시간이 영예를 얻는 것이지만 그렇지 않기 때문에

2009-09-28T10:00:00Z  (this is how it should be)

기본적으로 나는 이것을 사용합니다.

var jsonData = JSON.stringify(jsonObject);

교체기 매개 변수 (Stringify의 두 번째 매개 변수)를 전달하려고 시도했지만 문제는 값이 이미 처리되었다는 것입니다.

나는 또한 사용을 시도했다 toString() 그리고 toUTCString() 날짜 개체에서, 이것들은 나에게 내가 원하는 것을주지 않습니다 ..

누구든지 나를 도울 수 있습니까?

도움이 되었습니까?

해결책

최근에 나는 같은 문제가 발생했습니다. 다음 코드를 사용하여 해결되었습니다.

x = new Date();
let hoursDiff = x.getHours() - x.getTimezoneOffset() / 60;
let minutesDiff = (x.getHours() - x.getTimezoneOffset()) % 60;
x.setHours(hoursDiff);
x.setMinutes(minutesDiff);

다른 팁

JSON을 사용합니다 Date.prototype.toISOString 현지 시간을 나타내지 않는 함수 - 수정되지 않은 UTC에서 시간을 나타냅니다. 날짜 출력을 보면 UTC+2 시간을 볼 수 있으므로 JSON 문자열이 2 시간 만 변경되는 이유입니다. 동시에 여러 시간 영역에서 올바르게 표현할 수 있습니다.

레코드의 경우 "2009-09-28T08 : 00 : 00z의 마지막"Z "는 시간이 실제로 UTC에 있음을 의미합니다.

보다 http://en.wikipedia.org/wiki/iso_8601 자세한 내용은.

여기에 또 다른 대답이 있습니다 (그리고 개인적으로는 더 적절하다고 생각합니다)

var currentDate = new Date(); 
currentDate = JSON.stringify(currentDate);

// Now currentDate is in a different format... oh gosh what do we do...

currentDate = new Date(JSON.parse(currentDate));

// Now currentDate is back to its original form :)

조금 늦었지만 프로토 타입과 같은 날짜의 경우 항상 Tojson 기능을 덮어 쓸 수 있습니다.

Date.prototype.toJSON = function(){
    return Util.getDateTimeString(this);
};

내 경우, util.getDateMestring (this) : "2017-01-19T00 : 00 : 00Z"와 같은 문자열을 반환합니다.

DATE.TOJSON ()을 UTC 날짜를 문자열 형식으로 인쇄합니다 (따라서 JSON 형식으로 변환 할 때 오프셋을 추가).

date = new Date();
new Date(date.getTime() - (date.getTimezoneOffset() * 60000)).toJSON();

일반적으로 자신의 현지 시간에 각 사용자에게 날짜가 제시되기를 원합니다.

그렇기 때문에 GMT (UTC)를 사용합니다.

날짜 .parse (jsondatestring)를 사용하여 현지 시간 문자열을 얻으십시오.

너가 아니라면 원하다 각 방문자에게 현지 시간이 표시됩니다.

이 경우 Anatoly의 방법을 사용하십시오.

이 문제를 사용 하여이 문제를 해결했습니다 moment.js 라이브러리 (비 시간대 버전).

var newMinDate = moment(datePicker.selectedDates[0]);
var newMaxDate = moment(datePicker.selectedDates[1]);

// Define the data to ask the server for
var dataToGet = {"ArduinoDeviceIdentifier":"Temperatures",
                "StartDate":newMinDate.format('YYYY-MM-DD HH:mm'),
                "EndDate":newMaxDate.format('YYYY-MM-DD HH:mm')
};

alert(JSON.stringify(dataToGet));

나는 사용하고 있었다 flatpickr.min.js 도서관. 생성 된 JSON 객체의 시간은 날짜 선택기 외에 제공된 현지 시간과 일치합니다.

당신이 사용할 수있는 Moment.js 현지 시간과 함께 형식 :

Date.prototype.toISOString = function () {
    return moment(this).format("YYYY-MM-DDTHH:mm:ss");
};

강제에 대한 바깥 쪽 솔루션 JSON.stringify 시간을 무시하십시오 :

  • 순수한 자바 스크립트 (Anatoliy 답변 기반) :

// Before: JSON.stringify apply timezone offset
const date =  new Date();
let string = JSON.stringify(date);
console.log(string);

// After: JSON.stringify keeps date as-is!
Date.prototype.toJSON = function(){
    const hoursDiff = this.getHours() - this.getTimezoneOffset() / 60;
    this.setHours(hoursDiff);
    return this.toISOString();
};
string = JSON.stringify(date);
console.log(string);

Moment.js 라이브러리 사용 :

const date =  new Date();
let string = JSON.stringify(date);
console.log(string);

Date.prototype.toJSON = function(){
    return moment(this).format("YYYY-MM-DDTHH:mm:ss:ms");;
};
string = JSON.stringify(date);
console.log(string);
<html>
  <header>
    <script src="https://momentjs.com/downloads/moment.min.js"></script>
    <script src="https://momentjs.com/downloads/moment-timezone-with-data-10-year-range.min.js"></script>
</header>
</html>

여기에 정말 깔끔하고 단순한 것이 있습니다 (적극적으로 믿습니다 :)) Tojson과 같은 브라우저의 기본 기능 중 하나를 복제하거나 과부하를 걸어야합니다 (참조 : 참조 : 참조 : 참조 : 참조 : 참조 : 참조 : 참조 : 참조 : JSON이 JavaScript 날짜를 지정하고 시간대를 보존하는 방법, Courtsy Shawson)

교체 체 기능을 JSON에게 전달하십시오. 이렇게하면 시간과 분의 차이 또는 기타 조작을 할 필요가 없습니다.

Console.logs를 입력하여 중간 결과를 볼 수 있도록 중간 결과를 보았습니다. 그것은 통지 할 가치가있는 것을 보여줍니다 : value param to replacer는 이미 ISO 날짜 형식으로 변환되었습니다 :). 이 [키]를 사용하여 원본 데이터로 작업하십시오.

var replacer = function(key, value)
{
    var returnVal = value;
    if(this[key] instanceof Date)
    {
        console.log("replacer called with key - ", key, " value - ", value, this[key]); 

        returnVal = this[key].toString();

        /* Above line does not strictly speaking clone the date as in the cloned object 
         * it is a string in same format as the original but not a Date object. I tried 
         * multiple things but was unable to cause a Date object being created in the 
         * clone. 
         * Please Heeeeelp someone here!

        returnVal = new Date(JSON.parse(JSON.stringify(this[key])));   //OR
        returnVal = new Date(this[key]);   //OR
        returnVal = this[key];   //careful, returning original obj so may have potential side effect

*/
    }
    console.log("returning value: ", returnVal);

    /* if undefined is returned, the key is not at all added to the new object(i.e. clone), 
     * so return null. null !== undefined but both are falsy and can be used as such*/
    return this[key] === undefined ? null : returnVal;
};

ab = {prop1: "p1", prop2: [1, "str2", {p1: "p1inner", p2: undefined, p3: null, p4date: new Date()}]};
var abstr = JSON.stringify(ab, replacer);
var abcloned = JSON.parse(abstr);
console.log("ab is: ", ab);
console.log("abcloned is: ", abcloned);

/* abcloned is:
 * {
  "prop1": "p1",
  "prop2": [
    1,
    "str2",
    {
      "p1": "p1inner",
      "p2": null,
      "p3": null,
      "p4date": "Tue Jun 11 2019 18:47:50 GMT+0530 (India Standard Time)"
    }
  ]
}
Note p4date is string not Date object but format and timezone are completely preserved.
*/

나는 그들이 동부 해안에서만 일하고 UTC에 날짜를 저장하지 않는 레거시 물건으로 조금 일하는이 문제를 해결합니다. 브라우저의 사용자 입력을 기준으로 날짜를 필터링해야하므로 현지 시간으로 날짜를 JSON 형식으로 전달해야합니다.

이미 게시 된이 솔루션에 대해 자세히 설명하기 위해 - 이것이 내가 사용하는 것입니다.

// Could be picked by user in date picker - local JS date
date = new Date();

// Create new Date from milliseconds of user input date (date.getTime() returns milliseconds)
// Subtract milliseconds that will be offset by toJSON before calling it
new Date(date.getTime() - (date.getTimezoneOffset() * 60000)).toJSON();

따라서 내 이해는 시간 초대 오프셋 (수익률)을 기준으로 시작일부터 시간 (60000)으로 시간을 빼고 시간을 추가 할 예정입니다.

서버 백엔드가 타임 존-비수분자인지 아닌지에 따라 모든 것이 요약됩니다. 그렇지 않은 경우 서버의 시간대가 클라이언트와 동일하거나 클라이언트의 시간대에 대한 정보를 전송하고 계산에 포함한다고 가정해야합니다.

PostgreSQL 백엔드 기반 예 :

select '2009-09-28T08:00:00Z'::timestamp -> '2009-09-28 08:00:00' (wrong for 10am)
select '2009-09-28T08:00:00Z'::timestamptz -> '2009-09-28 10:00:00+02'
select '2009-09-28T08:00:00Z'::timestamptz::timestamp -> '2009-09-28 10:00:00'

마지막은 시간대 로직을 제대로 구현하지 않으면 데이터베이스에서 사용하려는 것일 것입니다.

대신에 toJSON, 당신이 사용할 수있는 체재 항상 올바른 날짜와 시간을 제공하는 함수 + GMT

이것은 가장 강력한 디스플레이 옵션입니다. 토큰 문자열이 필요하고 해당 값으로 대체합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top