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.