JavaScript의 Date를 JSON으로 변경합니다.임의 문자열 변환

4209 단어 Node.jsJavaScript

일의 시작


Express+Sequelize 시스템 구축 중 9시간 일자가 어긋나는 현상을 겪었다.
9시간을 엇갈린 것은 Sequelize가 만든 표에 포함된createdAt와 updatedAt, MySQL의 시간은 JST이며 DB에 저장된 시간도 JST이다.
그러나 Express에서res.json()으로 되돌아온createdAt와 updatedAt는 ISO8601 형식(YYYYYYY-MM-DDThddZ)으로 변환됐고, UTC여서 -9시간이 됐다.
원인을 살펴보면 JavaScript의 Date는 JSON입니다.stringify () 에서는 ISO8601 형식으로 문자열을 받는다는 것을 알았지만, 이것은 항상 UTC Node에 있습니다.js를 지정한 환경 변수 TZ(process.env.TZ)도 변화가 없기 때문에 매우 난처합니다.
그래서 Date에서 JSON을 만듭니다.stringify () 에 의해 문자열 변환을 담당하는 함수를 임의로 바꾸어 대응하기 때문에 여기에 기록이 남아 있습니다.

실제로 한 일


여러 가지 상황이 정확하지 않지만 이번 ISO8601 형식의 시간대도 UTC이지만 실제 시간대는 JST의 출력을 되돌려주는 것이다(원래 Z는 +0900이었는데 이번에는 용서해 주십시오).
Date.prototype.toJSON=function(){return this.getFullYear()+'-'+('0'+(this.getMonth()+1)).slice(-2)+'-'+('0'+this.getDate()).slice(-2)+'T'+('0'+this.getHours()).slice(-2)+':'+('0'+this.getMinutes()).slice(-2)+':'+('0'+this.getSeconds()).slice(-2)+'.000Z';}
Date는 JSON입니다.stingify () 시 toJSON () 문자열로 함수를 덮어씁니다.
밀리초와 시간대 표시가 위에서 말한 바와 같이 정확하지 않다는 것을 주의하십시오.
만약 이번이라면, Express를 초기화하기 전에 이 덮어쓰기 처리를 미리 준비하면,created At와 updated At는 안전하게 9시간이 걸리지 않습니다.

총결산


시간대 효과를 toJSON()에 지정합니다.부탁이야.너무 불편해서요.누구나 이 방법을 쓸 수 있다.

좋은 웹페이지 즐겨찾기