JS 날짜 객체에서 YYYYMMDD 형식의 문자열을 가져 옵니까?


398

JS를 사용 date object하여 YYYYMMDD형식 의 문자열로 바꾸려고 합니다. 합치보다 쉬운 방법이 있나요 Date.getYear(), Date.getMonth()그리고는 Date.getDay()?


4
그 세 가지를 연결하는 방법입니다
Juan Cortés

5
같은 날짜로 구문 분석 할 문자열을 원하면 월을 증가시키는 것을 잊지 마십시오. 사양에 맞추려면 월과 날짜의 한 자리 숫자를 '0'으로
채워야합니다.

답변:


621

자주 사용하는 변경된 코드 조각 :

Date.prototype.yyyymmdd = function() {
  var mm = this.getMonth() + 1; // getMonth() is zero-based
  var dd = this.getDate();

  return [this.getFullYear(),
          (mm>9 ? '' : '0') + mm,
          (dd>9 ? '' : '0') + dd
         ].join('');
};

var date = new Date();
date.yyyymmdd();

16
당신은 교체해야 [1].length===2문자열에 인덱서가 완벽하게 지원되지 않기 때문에. 이유는이 답변을 참조하십시오.
아이디 아 카피

6
var mm = (this.getMonth () + 101) .toStrung (). substring (0, 2);
9dan

7
@Aidiakapi의 수정의 실제 예를 원하는 누군가를 위해, 나는 여기에 바이올린을 만들 : jsfiddle.net/pcr8xbt5/1
killercowuk

1
점 구분 기호를 사용하려면 다음과 같이하십시오.[this.getFullYear(), mm<10 ? '0'+ mm: mm, dd<10 ? '0'+ dd : dd].join('.')
Kamil Kiełczewski

3
@ 9dan은해서는 안됩니다var mm = (this.getMonth() + 101).toString().substring(1, 3)
Pnar Sbi Wer

317

프로토 타입을 추가하는 것을 좋아하지 않았습니다. 대안은 다음과 같습니다.

var rightNow = new Date();
var res = rightNow.toISOString().slice(0,10).replace(/-/g,"");

<!-- Next line is for code snippet output only -->
document.body.innerHTML += res;


51
rightNow주위에 변수 가 필요하지 않으면 랩을 new Date한 줄로 (new Date()).toISOString().slice(0,10).replace(/-/g,"")
묶어

5
나는 원했다 YYYYMMDDHHmmSSsss. 그래서 나는 이렇게했다 var ds = (new Date()).toISOString().replace(/[^0-9]/g, "");. 매우 간단하지만 캡슐화되어야합니다.
Jess

65
Date.toISOString ()은 UTC 형식의 날짜를 생성하므로 시간대에 따라 날짜 경계를 이동할 수 있으므로 일반적으로 작동하지 않습니다. GMT + 1 예 : (새 날짜 (2013,13, 25)) toISOString () == '2013-12-24T23 : 00 : 00.000Z'.
weberste

26
10000 년에 누군가가 당신의 '고향'코드를 사용한다면 이것은 실패 할 것입니다.
Trevi Awater

9
시간대에 대처하기위한 개선 제안. rightNow.setMinutes(rightNow.getMinutes() - rightNow.getTimezoneOffset()); rightNow.toISOString().slice(0,10)
Andreas

182

당신은 toISOString기능을 사용할 수 있습니다 :

var today = new Date();
today.toISOString().substring(0, 10);

"yyyy-mm-dd"형식을 제공합니다.


24
어떤 경우에는 시간대 일광 등으로 인해 올바른 날이 포함되지 않습니다.
Miguel

1
어쩌면 내 창의력이 @Miguel을 깨 뜨렸을 수도 있지만, 그런 일이 일어날 경우는 생각할 수 없습니다. 예를 들어 주시겠습니까?
cloudworks

35
+1 시간대에 있고 날짜가 [2015-09-01 00:00:00 GMT + 1] 인 경우 toISOString () 메서드는 '2015-08-31T23 : 00 : 00.000Z 문자열을 반환합니다. '는 날짜가 문자열 화되기 전에 UTC / 0 오프셋으로 변환되기 때문입니다.
Luke Baulch

조금 더 짧습니다 ... var today = (new Date ()). toISOString (). substring (0, 10);
teawithfruit

다른 GMT로 실패
Tobia

132

Moment.js 는 당신의 친구가 될 수 있습니다

var date = new Date();
var formattedDate = moment(date).format('YYYYMMDD');

18
잘 내 app.js에 40kb (최소, gZip이 아닌)를 추가했지만 감사했습니다. :).
Bart

지금까지 가장 좋은 답변!
TrulyXax

9
난 그냥 프로젝트 :)의 시작을 추가, 내가 필연적으로 더 이상 순간을 필요로 할 때까지 대기 귀찮게하지 않습니다
martinedwards

1
: 당신은 쉽게 만들 수 있습니다var formattedDate = moment().format('YYYYMMDD');
NS16

37

순수한 JS 솔루션이 필요하지 않은 경우 jQuery UI를 사용하여 다음과 같은 작업을 수행 할 수 있습니다.

$.datepicker.formatDate('yymmdd', new Date());

나는 보통 너무 많은 라이브러리를 가져오고 싶지 않습니다. 그러나 jQuery UI는 매우 유용하므로 프로젝트의 다른 곳에서 사용할 수 있습니다.

더 많은 예제를 보려면 http://api.jqueryui.com/datepicker/ 를 방문하십시오.


37

이것은 YYYY-MM-DD오늘 날짜 문자열 을 만드는 데 사용할 수있는 한 줄의 코드입니다 .

var d = new Date().toISOString().slice(0,10);

^이! FTW! +1 .. 그래도 약간의 테스트가 필요합니다.
Gogol

21
날짜가 2016 년 1 월 1 일 00:00:00 GMT +2 인 경우 2015-12-31T22 : 00 : 00 GMT +0 (2 시간 전)을 제공 하므로 2015-12-31 이 반환 toISOString()됩니다.
Jérôme Gillard

29
new Date('Jun 5 2016').
  toLocaleString('en-us', {year: 'numeric', month: '2-digit', day: '2-digit'}).
  replace(/(\d+)\/(\d+)\/(\d+)/, '$3-$1-$2');

// => '2016-06-05'

5
최고의 영혼.
زياد

어떤 이유로, 미국 동부 해안에서 수식을 실행할 때 하루를 다시 건너 뛰지 않도록 변환 시간을 추가해야했습니다 (00:00조차도). 일단 그렇게하면 안정적으로 작동하기 시작했습니다. 내가 좋아하는 것은 입력 날짜를 여러 형식으로 취할 수 있으므로 더 이상 걱정할 필요가 없습니다. new Date('Sun Mar 31 2019 00:00:00.000').toLocaleString('en-us', {year: 'numeric', month: '2-digit', day: '2-digit'}).replace(/(\d+)\/(\d+)\/(\d+)/, '$3-$1-$2');
nenea

24

oo의 답변 외에도 논리 연산을 반환에서 분리하고 대신 변수에 삼항으로 넣는 것이 좋습니다.

또한 concat()변수를 안전하게 연결 하는 데 사용

Date.prototype.yyyymmdd = function() {
  var yyyy = this.getFullYear();
  var mm = this.getMonth() < 9 ? "0" + (this.getMonth() + 1) : (this.getMonth() + 1); // getMonth() is zero-based
  var dd = this.getDate() < 10 ? "0" + this.getDate() : this.getDate();
  return "".concat(yyyy).concat(mm).concat(dd);
};

Date.prototype.yyyymmddhhmm = function() {
  var yyyymmdd = this.yyyymmdd();
  var hh = this.getHours() < 10 ? "0" + this.getHours() : this.getHours();
  var min = this.getMinutes() < 10 ? "0" + this.getMinutes() : this.getMinutes();
  return "".concat(yyyymmdd).concat(hh).concat(min);
};

Date.prototype.yyyymmddhhmmss = function() {
  var yyyymmddhhmm = this.yyyymmddhhmm();
  var ss = this.getSeconds() < 10 ? "0" + this.getSeconds() : this.getSeconds();
  return "".concat(yyyymmddhhmm).concat(ss);
};

var d = new Date();
document.getElementById("a").innerHTML = d.yyyymmdd();
document.getElementById("b").innerHTML = d.yyyymmddhhmm();
document.getElementById("c").innerHTML = d.yyyymmddhhmmss();
<div>
  yyyymmdd: <span id="a"></span>
</div>
<div>
  yyyymmddhhmm: <span id="b"></span>
</div>
<div>
  yyyymmddhhmmss: <span id="c"></span>
</div>


누군가 그것을 사용하는 것을 좋아한다면 여기에서 DRY를 제안하십시오. 다시 반복하여 동일한 기능을 수행하는 대신 이미 작성된 함수를 재사용하십시오.
RiZKiT

@RiZKiT DRY는 원칙이자 패턴은 아니지만 확실하게 개선 될 수 있습니다. 내가 이것을 어디에서 사용해야한다면 아마도 다른 패턴을 사용하고 메소드를 프로토 타입에서 멀리 떨어 뜨릴 것이다. 나는 주로 문제를 해결할 다른 방법을 보여주는 예제를 썼습니다. 사람들이 그곳에서 그것을 가져가는 곳
에릭 Herlitz

좋은! ("00" + (this.getDate())).slice(-2)숫자를 두 자리 숫자로 가져 오는 데 사용 합니다. "if"또는 "? :"문은없고 .getX () 함수에 대한 호출이 적습니다. 조금 더 빠르지 않으면 적어도 더 읽기 쉽습니다.
le hollandais volant

22

네이티브 객체를 수정하는 것을 좋아하지 않으며 허용되는 솔루션에 문자열을 채우는 것보다 곱셈이 더 명확하다고 생각합니다.

function yyyymmdd(dateIn) {
  var yyyy = dateIn.getFullYear();
  var mm = dateIn.getMonth() + 1; // getMonth() is zero-based
  var dd = dateIn.getDate();
  return String(10000 * yyyy + 100 * mm + dd); // Leading zeros for mm and dd
}

var today = new Date();
console.log(yyyymmdd(today));

피들 : http://jsfiddle.net/gbdarren/Ew7Y4/


4
이 답변은 downvoted되었으며 왜 그런지 모르겠습니다. 문자열 조작보다 수학이 더 빠르고 명확하다고 느꼈습니다. 이것이 왜 나쁜 대답인지 아는 사람이 있으면 알려주십시오.
대런 그리피스

4
10000 곱셈기는 YYYY를 왼쪽으로 4 자리 이동 (월 및 일 숫자는 각각 2 자리 필요)하며 Y10K 버그와 관련이 없습니다. 나는이 대답을 좋아하고 존경받을 가치가있다!
A. Masson

1
이 답변 주셔서 감사합니다 나는 바이올린 여기에 생성 jsfiddle.net/amwebexpert/L6j0omb4
A. 메이슨

1
나는 곱셈이 전혀 필요하지 않았으며 왜 그것이 있는지 이해하지 못합니다. jsfiddle.net/navyjax2/gbqmv0t5 그렇지 않으면, 그만 두십시오. 이것은 훌륭한 답변이며 많은 도움이되었습니다.
vapcguy

1
@ D-Money 아, 나는 당신이 의미하는 바를 알아 냈습니다. 서로 다른 수학 연산을 피하기 위해 숫자를 함께 더하여 서로 다른 종류의 연결을하고 있습니다. 그렇지 않으면 그들을 엉망으로 만들었습니다. 잘 했어! .replace('-', '')OP는 원래의 질문에 충실했으며 추가 단계가 필요하지 않은 구분 기호를 사용하기 때문에 작동 합니다. 우수한!
vapcguy

15

UTC에서 Date.toISOString () 인쇄로 인한 가능한 날짜 점프 문제가없는 일반 JS (ES5) 솔루션 :

var now = new Date();
var todayUTC = new Date(Date.UTC(now.getFullYear(), now.getMonth(), now.getDate()));
return todayUTC.toISOString().slice(0, 10).replace(/-/g, '');

이것은 @Pierre Guilbert의 답변에 대한 @weberste의 의견에 대한 답변입니다.


now.getMonth ()는 1 월에 0을 반환합니다. (now.getMonth () + 1)
Jas

2
잘못된. Date의 UTC 함수는 월이 0과 11 사이 일 것으로 예상하지만 다른 <0과> 11이 허용됩니다.
Dormouse

여러 개의 하이픈을 단일 하이픈으로 바꾸는 이유는 무엇입니까? toISOString여러 개의 연속적인 하이픈을 반환 할 수 있습니까 ?
Michaël Witrant

Michael-발견 된 하이픈을 단일 하이픈으로 바꿉니다 . 여전히 이유를 모릅니다 (아마 교체 문자열은 구분 기호의 자리 표시 자 일 것입니다). 'g'는 모든 경우를 의미합니다. 당신이 생각하는 패턴은 / [-] + / g입니다
Gerard ONeill

2
당신은 내 하루를 만들었습니다. Javascript에서 끔찍한 TimeZone 처리를 우회하는 간단한 방법을 며칠 동안 찾고 있었으며 이것이 트릭입니다!

10

// UTC/GMT 0
document.write('UTC/GMT 0: ' + (new Date()).toISOString().slice(0, 19).replace(/[^0-9]/g, "")); // 20150812013509

// Client local time
document.write('<br/>Local time: ' + (new Date(Date.now()-(new Date()).getTimezoneOffset() * 60000)).toISOString().slice(0, 19).replace(/[^0-9]/g, "")); // 20150812113509


이것이 내가 사용한 대답입니다. 시간대를 고려한 하나의 라이너. 원래 포스터의 질문에 대답하기 위해 다음을 수행 할 수 있습니다. (new Date (Date.now ()-(new Date ()). getTimezoneOffset () * 60000)). toISOString (). replace (/ [^ 0-9] / g, "") .slice (0,8)
tomwoods

thx, YYYY-MM-DD를 얻으려면 사용 : new Date (Date.now ()-(new Date ()). getTimezoneOffset () * 60000) .toISOString (). slice (0, 10) .replace (/ [ ^ 0-9] / g, "-")
Nick Humphrey

7

var someDate = new Date();
var dateFormated = someDate.toISOString().substr(0,10);

console.log(dateFormated);


아주 똑똑. 감사합니다
JMaylin

4
새 Date ()에 시간대가 있고 Date.toISOString ()이 UTC이므로 작동하지 않습니다. 내 대답을 참조하십시오.
Dormouse

@Dormouse 다른 방법이 아닌가요? new Date()nr 주위의 래퍼 인 새로운 날짜 객체를 만듭니다. 1970/01/01 00 : 00 : 00.000 UTC 이후의 ms입니다. 그런 다음 toISOString현지 시간대로 인쇄합니다.
Stijn de Witt

아니요, Date.toISOString ()은 UTC로 인쇄됩니다.
Dormouse

7

또 다른 방법은 스웨덴, 리투아니아, 헝가리, 한국 등과 같이 빅 엔디안 날짜 형식 표준toLocaleDateString 이있는 로케일과 함께 사용하는 것 입니다 .

date.toLocaleDateString('se')

구분 기호 ( -) 를 제거하는 것은 숫자가 아닌 숫자를 바꾸는 것입니다.

console.log( new Date().toLocaleDateString('se').replace(/\D/g, '') );

UTC 날짜 형식으로 얻을 수있는 잠재적 인 오류는 없습니다. UTC 날짜는 현지 시간대의 날짜와 비교하여 하루 쉬는 날입니다.


6

이 한 줄 코드를 사용하여 연도 날짜를 얻을 수 있습니다.

var date = new Date().getFullYear() + "-" + (parseInt(new Date().getMonth()) + 1) + "-" + new Date().getDate();

5

이 글 https://stackoverflow.com/a/3067896/5437379 에서 가장 많이 사용되는 답변을위한 약간 단순화 된 버전 :

function toYYYYMMDD(d) {
    var yyyy = d.getFullYear().toString();
    var mm = (d.getMonth() + 101).toString().slice(-2);
    var dd = (d.getDate() + 100).toString().slice(-2);
    return yyyy + mm + dd;
}

5

dateformat 은 매우 많이 사용되는 패키지입니다.

사용하는 방법:

dateformatNPM에서 다운로드하여 설치하십시오 . 모듈에 필요합니다 :

const dateFormat = require('dateformat');

그런 다음 형식을 지정하십시오.

const myYYYYmmddDate = dateformat(new Date(), 'yyyy-mm-dd');


4

이 사람은 여기 => http://blog.stevenlevithan.com/archives/date-time-formatformat() 이 Javascript Date객체에 대한 함수를 작성 했으므로 친숙한 리터럴 형식으로 사용할 수 있습니다.

앱의 Javascript에서 완전한 기능을 갖춘 날짜 형식이 필요한 경우 사용하십시오. 그렇지 않으면 당신이하고 싶은 일이 하나 떨어져 있다면 getYear (), getMonth (), getDay ()를 연결하는 것이 가장 쉽습니다.


4

@oo의 대답에서 작업하면 형식 문자열에 따라 날짜 문자열이 다시 제공됩니다. 필요한 경우 연도 및 밀리 초에 대해 2 자리 연도 정규식을 쉽게 추가 할 수 있습니다.

Date.prototype.getFromFormat = function(format) {
    var yyyy = this.getFullYear().toString();
    format = format.replace(/yyyy/g, yyyy)
    var mm = (this.getMonth()+1).toString(); 
    format = format.replace(/mm/g, (mm[1]?mm:"0"+mm[0]));
    var dd  = this.getDate().toString();
    format = format.replace(/dd/g, (dd[1]?dd:"0"+dd[0]));
    var hh = this.getHours().toString();
    format = format.replace(/hh/g, (hh[1]?hh:"0"+hh[0]));
    var ii = this.getMinutes().toString();
    format = format.replace(/ii/g, (ii[1]?ii:"0"+ii[0]));
    var ss  = this.getSeconds().toString();
    format = format.replace(/ss/g, (ss[1]?ss:"0"+ss[0]));
    return format;
};

d = new Date();
var date = d.getFromFormat('yyyy-mm-dd hh:ii:ss');
alert(date);

그러나 그것이 정규 표현식을 많이 사용하기 때문에 특히 성능이 얼마나 효율적인지 모르겠습니다. 아마도 순수한 js를 마스터하지 않는 일부 작업을 사용할 수 있습니다.


4

이 코드는 Pierre Guilbert의 답변에 수정되었습니다.

(10000 년이 지난 후에도 작동합니다)

YYYYMMDD=new Date().toISOString().slice(0,new Date().toISOString().indexOf("T")).replace(/-/g,"")


3

나는 이것을해야 할 때 일반적으로 아래 코드를 사용합니다.

var date = new Date($.now());
var dateString = (date.getFullYear() + '-'
    + ('0' + (date.getMonth() + 1)).slice(-2)
    + '-' + ('0' + (date.getDate())).slice(-2));
console.log(dateString); //Will print "2015-09-18" when this comment was written

.slice (-2)는 문자열의 마지막 두 문자를 알려줍니다.

따라서 어떤 일이 있더라도 요일이나 월에 "0"을 추가 할 수 있으며 마지막 두 개는 항상 원하는 두 개이므로 요청하십시오.

따라서 MyDate.getMonth ()가 9를 반환하면 다음과 같습니다.

("0" + "9") // Giving us "09"

그래서 .slice (-2)를 추가하면 마지막 두 문자가 나타납니다.

("0" + "9").slice(-2)

"09"

그러나 date.getMonth ()가 10을 반환하면 다음과 같습니다.

("0" + "10") // Giving us "010"

따라서 .slice (-2)를 추가하면 마지막 두 문자가 나타납니다.

("0" + "10").slice(-2)

"10"

3

AngularJ (최대 1.5)를 사용하는 경우 날짜 필터를 사용할 수 있습니다 .

var formattedDate = $filter('date')(myDate, 'yyyyMMdd')

3

단순성 및 가독성에 대한 또 다른 대답.
또한 새로운 방법으로 기존의 미리 정의 된 클래스 멤버를 편집하지 않는 것이 좋습니다.

function getDateInYYYYMMDD() {
    let currentDate = new Date();

    // year
    let yyyy = '' + currentDate.getFullYear();

    // month
    let mm = ('0' + (currentDate.getMonth() + 1));  // prepend 0 // +1 is because Jan is 0
    mm = mm.substr(mm.length - 2);                  // take last 2 chars

    // day
    let dd = ('0' + currentDate.getDate());         // prepend 0
    dd = dd.substr(dd.length - 2);                  // take last 2 chars

    return yyyy + "" + mm + "" + dd;
}

var currentDateYYYYMMDD = getDateInYYYYMMDD();
console.log('currentDateYYYYMMDD: ' + currentDateYYYYMMDD);


2

추가적이지만 작은 라이브러리를 포함하지 않아도 Sugar.js 는 JavaScript 로 날짜를 처리 할 수 있는 훌륭한 기능을 제공합니다 . 날짜를 포맷하기 위해 사용하는 포맷 기능 :

new Date().format("{yyyy}{MM}{dd}")

2

yyyymmdd=x=>(f=x=>(x<10&&'0')+x,x.getFullYear()+f(x.getMonth()+1)+f(x.getDate()));
alert(yyyymmdd(new Date));


1
답변에 설명을 추가하면 투표자가이 코드에서 수행중인 작업을 조금 설명하여 다른 사람들이 더 명확하게 이해할 수 있도록합니다.
Muhammad Omer Aslam

엄격 모드 또는 타이프 스크립트에서는 "let f, yyyymmdd = x => ..."를 대신 사용하십시오. yyyymmdd 및 f 함수는 그렇지 않으면 정의되지 않습니다.
Max


2

padStart 사용 :

Date.prototype.yyyymmdd = function() {
    return [
        this.getFullYear(),
        (this.getMonth()+1).toString().padStart(2, '0'), // getMonth() is zero-based
        this.getDate().toString().padStart(2, '0')
    ].join('-');
};

1

날짜시간을 모두 허용하는보다 일반적인 접근 방식은 다음과 같습니다. 구성 요소를 숫자 또는 문자열과 동일하게 정렬 .

날짜 ISO 형식의 번호 순서에 따라 현지 시간대로 변환하고 숫자가 아닌 숫자를 제거하십시오. 즉 :

// monkey patch version
Date.prototype.IsoNum = function (n) {
    var tzoffset = this.getTimezoneOffset() * 60000; //offset in milliseconds
    var localISOTime = (new Date(this - tzoffset)).toISOString().slice(0,-1);
    return localISOTime.replace(/[-T:\.Z]/g, '').substring(0,n || 20); // YYYYMMDD
}

용법

var d = new Date();
// Tue Jul 28 2015 15:02:53 GMT+0200 (W. Europe Daylight Time)
console.log(d.IsoNum(8));  // "20150728"
console.log(d.IsoNum(12)); // "201507281502"
console.log(d.IsoNum());   // "20150728150253272"

1

기본 자바 스크립트 :

new Date().toLocaleString('zu-ZA').slice(0,10).replace(/-/g,'');

1
월이 2 자리가되도록 0으로 월을 채우지 않습니다.
Attila Szeremi

네가 옳아. 나는 나중에 이것을 스스로 알아 차렸다. 두 자리 수의 월과 일에 날짜 형식을 신중하게 테스트해야합니다.
Lonnie Best
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.