development

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

big-blog 2020. 9. 15. 18:52
반응형

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 라고도 합니다.

In this format, UTC is represented with a Z while all other formats are represented by an offset from UTC. The meaning is the same as JavaScript's, but the order of subtraction is inverted, so the result carries the opposite sign.

Also, there is no method on the native Date object called format, so your function in #1 will fail unless you are using a library to achieve this. Refer to this documentation.

If you are seeking a library that can work with this format directly, I recommend trying moment.js. In fact, this is the default format, so you can simply do this:

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

This is a well-tested, cross-browser solution, and has many other useful features.


This is my function for the clients timezone, it's lite weight and simple

  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;
  }

Just my two sends here

I was facing this issue with datetimes so what I did is this:

const moment = require('moment-timezone')

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

Then save date to db to be able to compare it from some query.


To install moment-timezone

npm i moment-timezone

Check this:

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'

참고URL : https://stackoverflow.com/questions/17415579/how-to-iso-8601-format-a-date-with-timezone-offset-in-javascript

반응형