programing

JavaScript에서 ISO 8601 형식의 문자열을 출력하려면 어떻게 해야 합니까?

sourcetip 2022. 9. 12. 12:19
반응형

JavaScript에서 ISO 8601 형식의 문자열을 출력하려면 어떻게 해야 합니까?

는 나나 a a a가 있다Date물건.다음 스니펫 부분을 어떻게 렌더링해야 합니까?

<abbr title="2010-04-02T14:12:07">A couple days ago</abbr>

나는 다른 도서관에서 "단어로 된 상대 시간" 부분을 가지고 있다.

다음을 시도했습니다.

function isoDate(msSinceEpoch) {

   var d = new Date(msSinceEpoch);
   return d.getUTCFullYear() + '-' + (d.getUTCMonth() + 1) + '-' + d.getUTCDate() + 'T' +
          d.getUTCHours() + ':' + d.getUTCMinutes() + ':' + d.getUTCSeconds();

}

하지만 그 결과 다음과 같이 됩니다.

"2010-4-2T3:19"

다음과 같은 함수가 이미 있습니다.

var date = new Date();
date.toISOString(); //"2011-12-19T15:28:46.493Z"

만약 당신이 그것을 지원하지 않는 브라우저에 접속되어 있다면, 나는 당신을 보호한다:

if (!Date.prototype.toISOString) {
  (function() {

    function pad(number) {
      var r = String(number);
      if (r.length === 1) {
        r = '0' + r;
      }
      return r;
    }

    Date.prototype.toISOString = function() {
      return this.getUTCFullYear() +
        '-' + pad(this.getUTCMonth() + 1) +
        '-' + pad(this.getUTCDate()) +
        'T' + pad(this.getUTCHours()) +
        ':' + pad(this.getUTCMinutes()) +
        ':' + pad(this.getUTCSeconds()) +
        '.' + String((this.getUTCMilliseconds() / 1000).toFixed(3)).slice(2, 5) +
        'Z';
    };

  }());
}

console.log(new Date().toISOString())

주의: 이 답변은 2022-03년 현재도 여전히 지지를 받고 있습니다.moment.js 라이브러리는 더 이상 사용되지 않습니다.Luxon과 Day.js의 두 가지 주요 대안이 있으며, 그 외는 폐지 링크에 기재되어 있습니다.

룩손

룩슨은 모멘트의 진화라고 생각할 수 있다.이 책은 모먼트의 오랜 기고자인 아이작 캠브론이 집필했다.Luxon의 존재 이유 및 Luxon 문서의 For Moment 사용자 페이지를 참조하십시오.

로케일:국제 표준 시간대:제공된 국제어

day.js

Day.js는 유사한 API를 사용하여 Moment.js를 최소화할 수 있도록 설계되었습니다.드롭인 대체는 아니지만, Moment의 API 사용에 익숙하고 빠르게 작업을 진행하려면 Day.js 사용을 고려해 보십시오.

로케일:시간대를 개별적으로 가져올 수 있는 사용자 지정 데이터 파일:플러그인 경유로 제공된 인터L

사이즈 차이 때문에 Day.js를 사용하고 있습니다만, Luxon이 다루기 쉽습니다.


웹상의 거의 모든 to-ISO 메서드는 문자열을 출력하기 전에 "Z"ulu time(UTC)"에 변환을 적용하여 시간대 정보를 폐기합니다.브라우저의 네이티브 .toIString()도 시간대 정보를 삭제합니다.

이것에 의해, 서버 또는 수신자는, 송신자의 타임 존 정보를 취득하면서, ISO 의 완전한 날짜를 항상 Zulu 시각 또는 필요한 타임 존으로 변환할 수 있기 때문에, 귀중한 정보를 폐기할 수 있습니다.

제가 찾은 최고의 솔루션은 Moment.js javascript 라이브러리를 사용하고 다음 코드를 사용하는 것입니다.

표준 시간대 정보 및 밀리초를 사용하여 현재 ISO 시간을 가져오려면 다음과 같이 하십시오.

now = moment().format("YYYY-MM-DDTHH:mm:ss.SSSZZ")
// "2013-03-08T20:11:11.234+0100"

now = moment().utc().format("YYYY-MM-DDTHH:mm:ss.SSSZZ")
// "2013-03-08T19:11:11.234+0000"

now = moment().utc().format("YYYY-MM-DDTHH:mm:ss") + "Z"
// "2013-03-08T19:11:11Z" <- better use the native .toISOString() 

표준 시간대 정보를 포함하지만 밀리초 없이 네이티브 JavaScript Date 개체의 ISO 시간을 가져오려면 다음과 같이 하십시오.

var current_time = Date.now();
moment(current_time).format("YYYY-MM-DDTHH:mm:ssZZ")

이를 Date.js와 조합하여 Date와 같은 함수를 얻을 수 있습니다.그 결과를 모멘트로 전달할 수 있는 today()입니다.

이와 같은 형식의 날짜 문자열은 JSON을 지원하므로 데이터베이스에 저장하기에 적합합니다.Python과 C#은 그것을 좋아하는 것 같다.

https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference:Global_Objects:Date 페이지의 마지막 예를 참조하십시오.

/* Use a function for the exact format desired... */
function ISODateString(d) {
    function pad(n) {return n<10 ? '0'+n : n}
    return d.getUTCFullYear()+'-'
         + pad(d.getUTCMonth()+1)+'-'
         + pad(d.getUTCDate())+'T'
         + pad(d.getUTCHours())+':'
         + pad(d.getUTCMinutes())+':'
         + pad(d.getUTCSeconds())+'Z'
}

var d = new Date();
console.log(ISODateString(d)); // Prints something like 2009-09-28T19:03:12Z

질문한 것은 ISO 포맷의 정밀도가 저하된 것이었습니다.Voila:

 new Date().toISOString().slice(0, 19) + 'Z'
 // '2014-10-23T13:18:06Z'

후행 Z가 필요하다고 가정하고, 그렇지 않으면 생략합니다.

가장 짧지만 Internet Explorer 8 이전 버전에서는 지원되지 않습니다.

new Date().toJSON()

IE7을 지원할 필요가 없는 경우, 다음은 훌륭하고 간결한 해킹입니다.

console.log(
  JSON.parse(JSON.stringify(new Date()))
)

일반적으로 UTC 날짜는 고객이 머릿속으로 변환하는 것을 좋아하지 않기 때문에 표시하지 않습니다.로컬 ISO 날짜를 표시하려면 다음 함수를 사용합니다.

function toLocalIsoString(date, includeSeconds) {
    function pad(n) { return n < 10 ? '0' + n : n }
    var localIsoString = date.getFullYear() + '-'
        + pad(date.getMonth() + 1) + '-'
        + pad(date.getDate()) + 'T'
        + pad(date.getHours()) + ':'
        + pad(date.getMinutes()) + ':'
        + pad(date.getSeconds());
    if(date.getTimezoneOffset() == 0) localIsoString += 'Z';
    return localIsoString;
};

위의 함수는 시간대 오프셋 정보를 생략하고 있기 때문에(현지시각이 UTC인 경우는 제외), 아래 함수를 사용하여 로컬 오프셋을 한 곳에 표시합니다.매번 오프셋을 표시하려면 위의 함수 결과에 출력을 추가할 수도 있습니다.

function getOffsetFromUTC() {
    var offset = new Date().getTimezoneOffset();
    return ((offset < 0 ? '+' : '-')
        + pad(Math.abs(offset / 60), 2)
        + ':'
        + pad(Math.abs(offset % 60), 2))
};

toLocalIsoString사용하다pad필요한 경우라면 거의 모든 패드 기능과 동일하게 동작하지만, 완성도를 위해 다음과 같이 사용하고 있습니다.

// Pad a number to length using padChar
function pad(number, length, padChar) {
    if (typeof length === 'undefined') length = 2;
    if (typeof padChar === 'undefined') padChar = '0';
    var str = "" + number;
    while (str.length < length) {
        str = padChar + str;
    }
    return str;
}

toISOString의 문제는 datetime을 "Z"로만 제공한다는 것입니다.

ISO-8601은 2016-07-16T19:20:30+5:30(UTC 시간대가 앞서는 경우) 및 2016-07-16T19:20:30-01:00(UTC 시간대가 뒤지는 경우)와 같은 형식으로 시간과 분 단위로 날짜 시간을 정의합니다.

특히 몇 줄의 코드로 얻을 수 있는 경우, 이러한 작은 태스크에 다른 플러그인인 moment.js를 사용하는 것은 좋은 생각이 아니라고 생각합니다.

시간대 오프셋이 시간 및 분 단위로 지정되면 datetime 문자열에 추가할 수 있습니다.

블로그에 글을 올렸습니다.http://usefulangle.com/post/30/javascript-get-date-time-with-offset-hours-minutes

var timezone_offset_min = new Date().getTimezoneOffset(),
  offset_hrs = parseInt(Math.abs(timezone_offset_min / 60)),
  offset_min = Math.abs(timezone_offset_min % 60),
  timezone_standard;

if (offset_hrs < 10)
  offset_hrs = '0' + offset_hrs;

if (offset_min > 10)
  offset_min = '0' + offset_min;

// getTimezoneOffset returns an offset which is positive if the local timezone is behind UTC and vice-versa.
// So add an opposite sign to the offset
// If offset is 0, it means timezone is UTC
if (timezone_offset_min < 0)
  timezone_standard = '+' + offset_hrs + ':' + offset_min;
else if (timezone_offset_min > 0)
  timezone_standard = '-' + offset_hrs + ':' + offset_min;
else if (timezone_offset_min == 0)
  timezone_standard = 'Z';

// Timezone difference in hours and minutes
// String such as +5:30 or -6:00 or Z
console.log(timezone_standard);

'T' 뒤에 '+'가 누락되어 있습니다.

isoDate: function(msSinceEpoch) {
  var d = new Date(msSinceEpoch);
  return d.getUTCFullYear() + '-' + (d.getUTCMonth() + 1) + '-' + d.getUTCDate() + 'T'
         + d.getUTCHours() + ':' + d.getUTCMinutes() + ':' + d.getUTCSeconds();
}

할 수 있을 거예요.

선행 0 의 경우는, 여기서 이것을 사용할 수 있습니다.

function PadDigits(n, totalDigits) 
{ 
    n = n.toString(); 
    var pd = ''; 
    if (totalDigits > n.length) 
    { 
        for (i=0; i < (totalDigits-n.length); i++) 
        { 
            pd += '0'; 
        } 
    } 
    return pd + n.toString(); 
} 

다음과 같이 사용합니다.

PadDigits(d.getUTCHours(),2)
function timeStr(d) { 
  return ''+
    d.getFullYear()+
    ('0'+(d.getMonth()+1)).slice(-2)+
    ('0'+d.getDate()).slice(-2)+
    ('0'+d.getHours()).slice(-2)+
    ('0'+d.getMinutes()).slice(-2)+
    ('0'+d.getSeconds()).slice(-2);
}

매우 적은 코드로 낮은 출력을 얻을 수 있었습니다.

var ps = new Date('2010-04-02T14:12:07')  ;
ps = ps.toDateString() + " " + ps.getHours() + ":"+ ps.getMinutes() + " hrs";

출력:

Fri Apr 02 2010 19:42 hrs

이 작은 확장자를 사용해서Date- http://blog.stevenlevithan.com/archives/date-time-format

var date = new Date(msSinceEpoch);
date.format("isoDateTime"); // 2007-06-09T17:46:21
function getdatetime() {
    d = new Date();
    return (1e3-~d.getUTCMonth()*10+d.toUTCString()+1e3+d/1)
        .replace(/1(..)..*?(\d+)\D+(\d+).(\S+).*(...)/,'$3-$1-$2T$4.$5Z')
        .replace(/-(\d)T/,'-0$1T');
}

Stack Overflow에 대한 기본을 (다른 Stack Exchange 코드 골프의 일부였던 것 같습니다) 찾아서 Internet Explorer 10 이전 버전에서도 작동하도록 개선했습니다.못생겼지만 그 일을 해낼 수 있어요.

Sean의 훌륭하고 간결한 답변을 설탕과 현대적인 구문과 함께 확장하려면:

// date.js

const getMonthName = (num) => {
  const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Oct', 'Nov', 'Dec'];
  return months[num];
};

const formatDate = (d) => {
  const date = new Date(d);
  const year = date.getFullYear();
  const month = getMonthName(date.getMonth());
  const day = ('0' + date.getDate()).slice(-2);
  const hour = ('0' + date.getHours()).slice(-2);
  const minutes = ('0' + date.getMinutes()).slice(-2);

  return `${year} ${month} ${day}, ${hour}:${minutes}`;
};

module.exports = formatDate;

그럼 예를 들어.

import formatDate = require('./date');

const myDate = "2018-07-24T13:44:46.493Z"; // Actual value from wherever, eg. MongoDB date
console.log(formatDate(myDate)); // 2018 Jul 24, 13:44

언급URL : https://stackoverflow.com/questions/2573521/how-do-i-output-an-iso-8601-formatted-string-in-javascript

반응형