programing

Javascript에서 ISO 8601 날짜 구문 분석

goodcopy 2021. 1. 18. 22:06
반응형

Javascript에서 ISO 8601 날짜 구문 분석


다음 구조의 ISO 8601 날짜를 자바 스크립트로 변환하는 방법에 대한 도움말 / 팁이 필요합니다.

CCYY-MM-DDThh:mm:ssTZD

다음과 같이 날짜 형식을 지정하고 싶습니다.

January 28, 2011 - 7:30PM EST

이 솔루션을 가능한 한 깨끗하고 최소한으로 유지하고 싶습니다.


datejs 는 다음을 구문 분석 할 수 있으므로 시도해 볼 수 있습니다.

Date.parse('1997-07-16T19:20:15')           // ISO 8601 Formats
Date.parse('1997-07-16T19:20:30+01:00')     // ISO 8601 with Timezone offset

편집 : 정규식 버전

x = "2011-01-28T19:30:00EST"

MM = ["January", "February","March","April","May","June","July","August","September","October","November", "December"]

xx = x.replace(
    /(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):\d{2}(\w{3})/,
    function($0,$1,$2,$3,$4,$5,$6){
        return MM[$2-1]+" "+$3+", "+$1+" - "+$4%12+":"+$5+(+$4>12?"PM":"AM")+" "+$6
    }
)

결과

January 28, 2011 - 7:30PM EST

Edit2 : 시간대를 EST로 변경했고 이제 다음을 얻었습니다.

x = "2011-01-28T19:30:00-05:00"

MM = {Jan:"January", Feb:"February", Mar:"March", Apr:"April", May:"May", Jun:"June", Jul:"July", Aug:"August", Sep:"September", Oct:"October", Nov:"November", Dec:"December"}

xx = String(new Date(x)).replace(
    /\w{3} (\w{3}) (\d{2}) (\d{4}) (\d{2}):(\d{2}):[^(]+\(([A-Z]{3})\)/,
    function($0,$1,$2,$3,$4,$5,$6){
        return MM[$1]+" "+$2+", "+$3+" - "+$4%12+":"+$5+(+$4>12?"PM":"AM")+" "+$6 
    }
)

반환

January 28, 2011 - 7:30PM EST

원래

String(new Date(x))

반환

Fri Jan 28 2011 19:30:00 GMT-0500 (EST)

위의 문자열을 필요한 형식으로 변환하는 정규식 부분.

January 28, 2011 - 7:30PM EST

Date 객체는 8601을 첫 번째 매개 변수로 처리합니다.

var d = new Date("2014-04-07T13:58:10.104Z");
console.log(d.toString());

단순하게 유지하려면 다음으로 충분합니다.

function parseIsoDatetime(dtstr) {
    var dt = dtstr.split(/[: T-]/).map(parseFloat);
    return new Date(dt[0], dt[1] - 1, dt[2], dt[3] || 0, dt[4] || 0, dt[5] || 0, 0);
}

노트 에서는 parseFloat가 필수입니다,으로 parseInt 항상 작동하지 않습니다. 지도에는 IE9 이상이 필요합니다.

형식에서 작동 :

  • 2014-12-28 15:30:30
  • 2014-12-28T15 : 30 : 30
  • 2014-12-28

시간대에는 유효하지 않습니다. 다른 답변을 참조하세요.


아마도, 내 의견으로는 클라이언트 측에서 날짜를 구문 분석, 형식화 및 작업하는 데 가장 적합한 JavaScript 라이브러리 인 moment.js를 사용할 수 있습니다. 다음과 같이 사용할 수 있습니다.

var momentDate = moment('1890-09-30T23:59:59+01:16:20', 'YYYY-MM-DDTHH:mm:ss+-HH:mm:ss');
var jsDate = momentDate.toDate();

// Now, you can run any JavaScript Date method

jsDate.toLocaleString();

moment.js와 같은 라이브러리 사용의 장점은 IE 8+와 같은 레거시 브라우저에서도 코드가 완벽하게 작동한다는 것입니다.

다음은 구문 분석 방법에 대한 문서입니다. https://momentjs.com/docs/#/parsing/


MSDN 에 따르면 JavaScript Date 개체는 특정 날짜 형식 지정 방법을 제공하지 않습니다 (다른 프로그래밍 언어에서 볼 수 있음). 그러나 몇 가지 Date방법과 서식을 사용하여 목표를 달성 할 수 있습니다.

function dateToString (date) {
  // Use an array to format the month numbers
  var months = [
    "January",
    "February",
    "March",
    ...
  ];

  // Use an object to format the timezone identifiers
  var timeZones = {
    "360": "EST",
    ...
  };

  var month = months[date.getMonth()];
  var day = date.getDate();
  var year = date.getFullYear();

  var hours = date.getHours();
  var minutes = date.getMinutes();
  var time = (hours > 11 ? (hours - 11) : (hours + 1)) + ":" + minutes + (hours > 11 ? "PM" : "AM");
  var timezone = timeZones[date.getTimezoneOffset()];

  // Returns formatted date as string (e.g. January 28, 2011 - 7:30PM EST)
  return month + " " + day + ", " + year + " - " + time + " " + timezone;
}

var date = new Date("2011-01-28T19:30:00-05:00");

alert(dateToString(date));

한 단계 더 나아가 Date.toString()메서드를 재정의 할 수도 있습니다 .

function dateToString () { // No date argument this time
  // Use an array to format the month numbers
  var months = [
    "January",
    "February",
    "March",
    ...
  ];

  // Use an object to format the timezone identifiers
  var timeZones = {
    "360": "EST",
    ...
  };

  var month = months[*this*.getMonth()];
  var day = *this*.getDate();
  var year = *this*.getFullYear();

  var hours = *this*.getHours();
  var minutes = *this*.getMinutes();
  var time = (hours > 11 ? (hours - 11) : (hours + 1)) + ":" + minutes + (hours > 11 ? "PM" : "AM");
  var timezone = timeZones[*this*.getTimezoneOffset()];

  // Returns formatted date as string (e.g. January 28, 2011 - 7:30PM EST)
  return month + " " + day + ", " + year + " - " + time + " " + timezone;
}

var date = new Date("2011-01-28T19:30:00-05:00");
Date.prototype.toString = dateToString;

alert(date.toString());

ReferenceURL : https://stackoverflow.com/questions/4829569/parsing-iso-8601-date-in-javascript

반응형