Date 객체를 복제하는 방법?


498

Date변수를 다른 변수에 할당 하면 참조가 동일한 인스턴스에 복사됩니다. 이것은 하나를 변경하면 다른 하나가 변경됨을 의미합니다.

실제로 Date인스턴스를 복제하거나 복사하려면 어떻게 해야합니까?

답변:


738

1970 년 1 월 1 일 00:00:00 ( epoch time ) 이후의 밀리 초 수를 반환 하는 Date 객체의 getTime()메서드를 사용하십시오 .

var date = new Date();
var copiedDate = new Date(date.getTime());

Safari 4에서는 다음과 같이 쓸 수도 있습니다.

var date = new Date();
var copiedDate = new Date(date);

...하지만 다른 브라우저에서 작동하는지 확실하지 않습니다. (IE8에서 작동하는 것 같습니다).


9
이 스 니펫에 대한 JSON? 이 사람들은 기본 사항을 명확하게 이해해야합니다. JavaScript DOM 용 jQuery를 잘못 사용하는 것과 같습니다.
Boldewyn

17
이 멋진 솔루션을 작성하는 또 다른 방법은 Date 프로토 타입을 확장하는 것입니다. Date.prototype.clone = function() { return new Date(this.getTime()); }; 다음과 같이 사용할 수 있습니다.copiedDate = date.clone();
Ryan

6
copiedDate = new Date(date)접근법은 IE6 +에서 작동합니다. Firefox에서 두 옵션은 동일한 속도입니다.
Ryan

14
new Date(date)동일 new Date(date.getTime()), JS 호출을 시도하기 때문에 date.valueOf()이 번호를 필요로 할 때와 date.valueOf()같은 동일 date.getTime()참조 Date.valueOf Object.valueOf
강철 같은 날개

10
첫 번째 방법은 최소한 Firefox와 IE (Chrome이 아님)의 날짜를 다르게 할 수 있으므로 new Date(date), 사용 new Date(date.getTime()또는 new Date(date.valueOf)대신 사용하지 마십시오 . 사용하여 예를 들어 toISOString()파이어 폭스 생성에 날짜 모두 "2015-04-21T04:56:42.000Z""2015-04-21T04:56:42.337Z".
crudh

114

이것은 가장 깨끗한 접근법입니다

let dat = new Date() 
let copyOf = new Date(dat.valueOf())

console.log(dat);
console.log(copyOf);


9
"Date"오브젝트에 대한 "valueOf ()"메소드는 "getTime ()"메소드와 동일한 결과를 생성합니다 (에포크 시간 이후 밀리 초 수).
스티브 해리슨

35
@Steve : true, 그러나 getTime ()은 시간 만 반환하고 날짜도 포함하지 않은 것처럼 "보여" "내가 가장 깨끗하게"참조 할 수 있습니다. 솔직히 Javascript의 Date 유형은 약간의 재난 영역이므로 처음에는 변경 할 수 없었습니다.
AnthonyWJones

1
@AnthonyWJones : 네, 무슨 말인지 알겠습니다.
스티브 해리슨

3
.valueOf ()가 더 명확하다는 데 동의합니다. 때로는 .getMilliseconds () b / c를 잊어 버리고 사용합니다 .epoch 시간 이후 평균 밀리 초를 의미하는 것처럼 들립니다.
Tom Wayson

1
Steve Harrison에게 +1 : 나는 그것이 사실인지 궁금해했다.
Brian Lacy

26
var orig = new Date();
var copy = new Date(+orig);

3
이 솔루션이 가장 좋습니다.
A1rPun

3
매우 정확하고 깨끗한 :)
robinmitra

33
당신은 그 마술 +이 JS 전문가 이외의 사람에게 무엇을 하고 있는지 설명해야합니다 .
Stijn de Witt

8
:) +부호는 여기에 unaray 연산자입니다. 의미 new Date( Number(orig)) 합니다. 자세한 내용은 여기를 참조하십시오 : developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Leonard Lepadatu

14

간체 버전 :

Date.prototype.clone = function () {
    return new Date(this.getTime());
}

72
당신은 내장 된 객체를 망칠 수 없습니다
Pawel

3
너는 네가 소유하지 않은 물건을 엉망으로 만들지 말라. 스코프를 사용하여 새 사본을 만들어 SuperDate 또는 그와 비슷한 것으로 불러야합니다. 버그를 테스트하기 어려운 많은 것은 예기치 않은 개체 기능 변경으로 인해 발생합니다.
Ray Foss

이것은 작동하지만 유지 관리상의 이유로이 방법은 코드 냄새로 간주됩니다. 나는 보통 코딩에서 사용하는 접근법을 작성했다 : actuts.wordpress.com/2017/01/10/…
Allan Chua

1
또한 처음에는 내장 메소드에 메소드를 추가하려고 할 때 이것이 필요하지 않습니다. 함수형 프로그래밍을 연구 하고 왜 좋은 구식 함수가 실제로 객체 자체의 메소드보다 훨씬 강력한 지 알아보십시오. 또한 더 짧습니다 : const cloneDate = d => new Date(d.getTime()).
Stijn de Witt

6

이 간단한 할당자가 작동한다는 것을 알았습니다.

dateOriginal = new Date();
cloneDate = new Date(dateOriginal);

그러나 나는 그것이 얼마나 "안전한지"모른다. IE7 및 Chrome 19에서 성공적으로 테스트되었습니다.


9
첫 번째 방법은 최소한 Firefox와 IE (Chrome이 아님)의 날짜를 다르게 할 수 있으므로 new Date(date), 사용 new Date(date.getTime()또는 new Date(date.valueOf)대신 사용하지 마십시오 . 사용하여 예를 들어 toISOString()파이어 폭스 생성에 날짜 모두 "2015-04-21T04:56:42.000Z""2015-04-21T04:56:42.337Z".
crudh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.