2009-07-07 3 views

ответ

507

Используйте getTime() метода, Date объекта, который возвращает количество миллисекунд с 1 января 1970 00:00:00 (epoch time):

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

В Safari 4, вы также можете написать:

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

... но я не уверен, работает ли это в других браузерах. (Кажется, это работает в IE8).

+0

Иногда люди также используют Сериализация JSON и десериализация, но это лучше и намного быстрее. +1 от меня. –

+7

JSON для этого фрагмента? Похоже, эти люди должны понять свои основы ... Как ошибочный jQuery для JavaScript DOM. – Boldewyn

+12

Другим способом написания этого приятного решения было бы расширить прототип Date: 'Date.prototype.clone = function() {return new Date (this.getTime()); }; ' Что вы могли бы использовать как' copiedDate = date.clone(); ' – Ryan

76

Это самый чистый подход

var dat = new Date() 

var copyOf = new Date(dat.valueOf()) 
+5

Метод valueOf() для объектов «Дата» дает тот же результат, что и его метод getTime() (число миллисекунд с момента времени). –

+23

@Steve: true, но getTime() может «выглядеть», например, он возвращает время и не включает дату, а значит, мою ссылку на «cleanest». Откровенно, тип Date в Javascript - это немного зоны бедствия, он никогда не должен был изменяться в первую очередь. – AnthonyWJones

+0

@ AnthonyWJones: Right , Я понимаю, что вы имеете в виду. –

-10

вы можете использовать универсальный метод:

  1. Дата

    var new_date = $.extend(new Date(), current_date); 
    
  2. Объект

    var new_object = $.extend({}, current_object); 
    

и другие ...

+6

Что вы подразумеваете под универсальным методом? Извините, я просто не понимаю. – Matthias

+0

JQuery $ .extend() копирует свойства из одного объекта в другой, поэтому он работает как своего рода родовая процедура мелкой копии. По крайней мере, я думаю, это то, что они имели в виду. –

+0

Этот метод полезен. – dexiang

13

Упрощенная версия:

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

Не будьте беспомощны со встроенными объектами – Pawel

+1

Не вмешивайся в объекты, которых ты не обладаешь. Вы должны сделать новую копию и назвать ее SuperDate или что-то еще, с учетом вашего объема. Многое, что сложно проверить на наличие ошибок, вызвано неожиданным изменением функциональности объекта. –

+0

Это будет работать, но для удобства обслуживания этот подход будет рассматриваться как запах кода. Я написал подход, который я обычно использую в своем кодировании: https://actuts.wordpress.com/2017/01/10/cloning-javascript-date-instances/ –

7

я узнал, что это просто assignmnent также работает:

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

Но я не знаю, как «безопасный " это. Успешно прошел испытания в IE7 и Chrome 19.

+6

Не используйте 'new Date (date)', используйте 'new Date (date.getTime()' или 'new Date (date.valueOf)', потому что первый способ может привести к различиям между датами, по крайней мере, в Firefox и IE (не Chrome). Например, используя 'toISOString()' в обеих датах в Firefox генерирует '" 2015-04-21T04: 56: 42.000Z "и' "2015-04-21T04: 56: 42.337Z" – crudh

8
var orig = new Date(); 
var copy = new Date(+orig); 
+0

Мне нравится это решение. – A1rPun

+0

Очень точный и чистый :) – robinmitra

+8

За исключением того, что вам нужно будет объяснить, что эта магия '+' делает для кого-либо, кроме экспертов JS. –

1

Если вы собираетесь добавить клон Date прототипа, то вы можете сделать это без перечислимы ...

Date.prototype = Object.defineProperty(Date.prototype, "clone", { 
     value: function (fromDate) { return new Date(fromDate.valueOf()); } 
    }); 
Смежные вопросы