[javascript] JavaScript에서 시간대 오프셋으로 날짜를 ISO 8601 형식으로 지정하는 방법은 무엇입니까?

목표 : 찾기 local timeUTC time offset다음 형식으로 다음의 URL을 구성.

URL 예 : / Actions / Sleep? duration = 2002-10-10T12 : 00 : 00−05 : 00

형식은 W3C 권장 사항을 기반으로합니다.
http://www.w3.org/TR/xmlschema11-2/#dateTime

문서는 다음과 같이 말합니다.

예를 들어 2002-10-10T12 : 00 : 00−05 : 00 (2002 년 10 월 10 일 정오, 미국 동부 표준시 및 중부 일광 절약 시간)은 2002-10-10T17 : 00 : 00Z와 같습니다. 2002-10-10T12 : 00 : 00Z보다 5 시간 늦습니다.

따라서 내 이해를 바탕으로 new Date ()로 현지 시간을 찾은 다음 getTimezoneOffset () 함수를 사용하여 차이를 계산 한 다음 문자열 끝에 첨부해야합니다.

1. 형식으로 현지 시간 가져 오기

var local = new Date().format("yyyy-MM-ddThh:mm:ss"); //today (local time)

산출

2013-07-02T09:00:00

2. UTC 시간 오프셋을 시간으로 가져옵니다.

var offset = local.getTimezoneOffset() / 60;

산출

7

3. URL 구성 (시간 부분 만 해당)

var duration = local + "-" + offset + ":00";

산출:

2013-07-02T09:00:00-7:00

위 출력은 내 현지 시간이 2013/07/02 9am이고 UTC와의 차이가 7 시간임을 의미합니다 (UTC는 현지 시간보다 7 시간 빠름).

지금까지 작동하는 것처럼 보이지만 getTimezoneOffset ()이 -120과 같은 음수 값을 반환하면 어떻게 될까요?

나는 W3C 문서에서 알아낼 수 없기 때문에 이러한 경우 형식이 어떻게 생겼는지 궁금합니다. 미리 감사드립니다.



답변

아래는 모든 브라우저에서 제대로 작동해야합니다 (팁은 @MattJohnson에게 감사드립니다).

Date.prototype.toIsoString = function() {
    var tzo = -this.getTimezoneOffset(),
        dif = tzo >= 0 ? '+' : '-',
        pad = function(num) {
            var norm = Math.floor(Math.abs(num));
            return (norm < 10 ? '0' : '') + norm;
        };
    return this.getFullYear() +
        '-' + pad(this.getMonth() + 1) +
        '-' + pad(this.getDate()) +
        'T' + pad(this.getHours()) +
        ':' + pad(this.getMinutes()) +
        ':' + pad(this.getSeconds()) +
        dif + pad(tzo / 60) +
        ':' + pad(tzo % 60);
}

var dt = new Date();
console.log(dt.toIsoString());


답변

getTimezoneOffset() 참조한 사양에 필요한 형식의 반대 부호를 반환합니다.

이 형식은 ISO8601 또는보다 정확하게는 RFC3339 라고도 합니다.

이 형식에서 UTC는으로 표시되고 Z다른 모든 형식은 UTC로부터의 오프셋으로 표시됩니다. 의미는 JavaScript와 동일하지만 빼기 순서가 반전되어 결과에 반대 부호가 표시됩니다.

또한 Date라는 네이티브 개체 에는 메서드가 없으므로 format라이브러리를 사용하여이를 달성하지 않는 한 # 1의 함수가 실패합니다. 이 문서를 참조하십시오 .

이 형식으로 직접 작업 할 수있는 라이브러리를 찾고 있다면 moment.js를 사용하는 것이 좋습니다 . 실제로 이것은 기본 형식이므로 다음과 같이 간단히 수행 할 수 있습니다.

var m = moment();    // get "now" as a moment
var s = m.format();  // the ISO format is the default so no parameters are needed

// sample output:   2013-07-01T17:55:13-07:00

이것은 잘 테스트 된 브라우저 간 솔루션이며 다른 많은 유용한 기능이 있습니다.


답변

표준 라이브러리에 대한 단일 API 호출만으로 요청 된 정보를 얻을 수 있다는 점을 고려할 가치가 있다고 생각합니다.

new Date().toLocaleString( 'sv', { timeZoneName: 'short' } );

// produces "2019-10-30 15:33:47 GMT−4"

‘T’구분 기호를 추가하거나 ‘GMT-‘를 제거하거나 끝에 ‘: 00’을 추가하려면 텍스트 교체를 수행해야합니다.

그러나 원하는 경우 다른 옵션을 쉽게 사용할 수 있습니다 . 12h 시간을 사용하거나 초를 생략하십시오.

스웨덴은 ISO 8601 형식을 사용하는 국가 중 하나이기 때문에 로케일로 스웨덴을 사용하고 있습니다. 나는 대부분의 ISO 국가가 시간대 약어를 사용하는 캐나다 이외의 시간대 오프셋 에이 ‘GMT-4’형식을 사용한다고 생각합니다. 동부 일광 절약 시간의 경우 “EDT”.

새로운 표준 i18n 함수 “Intl.DateTimeFormat ()”에서 동일한 것을 얻을 수 있지만 옵션을 통해 시간을 포함하도록 지정해야합니다. 그렇지 않으면 날짜 만 제공됩니다.


답변

이것은 클라이언트 시간대에 대한 내 기능이며 가볍고 간단합니다.

  function getCurrentDateTimeMySql() {        
      var tzoffset = (new Date()).getTimezoneOffset() * 60000; //offset in milliseconds
      var localISOTime = (new Date(Date.now() - tzoffset)).toISOString().slice(0, 19).replace('T', ' ');
      var mySqlDT = localISOTime;
      return mySqlDT;
  }


답변

이것을 확인하십시오 :

function dateToLocalISO(date) {
    const off    = date.getTimezoneOffset()
    const absoff = Math.abs(off)
    return (new Date(date.getTime() - off*60*1000).toISOString().substr(0,23) +
            (off > 0 ? '-' : '+') + 
            (absoff / 60).toFixed(0).padStart(2,'0') + ':' + 
            (absoff % 60).toString().padStart(2,'0'))
}

// Test it:
d = new Date()

dateToLocalISO(d)
// ==> '2019-06-21T16:07:22.181-03:00'

// Is similar to:

moment = require('moment')
moment(d).format('YYYY-MM-DDTHH:mm:ss.SSSZ') 
// ==> '2019-06-21T16:07:22.181-03:00'


답변

moment.js가 필요하지 않습니다. 여기 에 ISOLocal 문자열을 GMT에서 UTCseconds로 출력하는 “datetime-local” 입력 유형 에서 전체 왕복 답변이 있습니다 .

<input type="datetime-local" value="2020-02-16T19:30">

isoLocal="2020-02-16T19:30"
utcSeconds=new Date(isoLocal).getTime()/1000

//here you have 1581899400 for utcSeconds

let isoLocal=new Date(utcSeconds*1000-new Date().getTimezoneOffset()*60000).toISOString().substring(0,16)
2020-02-16T19:30


답변

내 두 사람 만 여기로 보내

나는 datetimes와 함께이 문제에 직면했기 때문에 내가 한 일은 다음과 같습니다.

const moment = require('moment-timezone')

const date = moment.tz('America/Bogota').format()

그런 다음 일부 쿼리에서 비교할 수 있도록 날짜를 db에 저장하십시오.


설치하기 위해서 moment-timezone

npm i moment-timezone