2009-07-07 18 views

Respuesta

507

el uso del método del objeto DategetTime(), que devuelve el número de milisegundos desde 1 de enero 1970 00:00:00 (epoch time):

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

En Safari 4, también se puede escribir:

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

... pero no estoy seguro de si esto funciona en otros navegadores. (Parece que funciona en IE8).

+0

veces las personas también utilizan Serialización JSON y deserialización, pero este es mejor y mucho más rápido. +1 de mi parte –

+7

JSON para este fragmento? Parece que estas personas deberían tener sus fundamentos claros ... Como confundir jQuery para DOM de JavaScript. – Boldewyn

+12

Otra forma de escribir esta buena solución sería extender el prototipo de fecha: 'Date.prototype.clone = function() {return new Date (this.getTime()); }; ' Que podría usar como' copiedDate = date.clone(); ' – Ryan

76

Este es el método más limpio

var dat = new Date() 

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

el método para objetos "Fecha" "valueOf()" produce el mismo resultado que su método "getTime()" (el número de milisegundos desde el tiempo de época) –

+23

@Steve:. cierto, pero getTime() podría "ve" al igual que solo devuelve el tiempo y no incluye la fecha, de ahí mi referencia a "más limpio." Francamente, el tipo de fecha en Javascript es un poco de zona de desastre, nunca debería haber sido mutable en primer lugar. – AnthonyWJones

+0

@AnthonyWJones: derecha , Veo lo que quieres decir. –

-10

puede utilizar un método universal:

  1. Fecha

    var new_date = $.extend(new Date(), current_date); 
    
  2. objeto

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

y otros ...

+6

¿Qué quieres decir con método universal? Lo siento, simplemente no lo entiendo. – Matthias

+0

Jquery $ .extend() copia las propiedades de un objeto a otro, por lo que funciona como una especie de rutina genérica de copia superficial. Al menos creo que eso es lo que querían decir. –

+0

Este método es útil. – dexiang

13

versión simplificada:

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

no te meterás con objetos incorporados – Pawel

+1

No te meterás con objetos que no te pertenezcan. Debe hacer una copia nueva y llamarla SuperDate o algo así, dentro de su alcance. Muchos de los errores difíciles de probar se deben a la modificación inesperada de la funcionalidad del objeto. –

+0

Esto funcionaría, pero por motivos de mantenimiento, este enfoque se consideraría como un olor a código. He escrito un enfoque que suelo usar en mi codificación: https://actuts.wordpress.com/2017/01/10/cloning-javascript-date-instances/ –

7

descubrí que este sencillo assignmnent también funciona:

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

Pero no sé cómo "seguro " es. Probado con éxito en IE7 y Chrome 19.

+6

No use 'new Date (date)', use 'new Date (date.getTime()' or 'new Date (date.valueOf)' en su lugar, ya que la primera puede ocasionar diferencias entre las fechas, al menos, en Firefox y IE (no Chrome). Por ejemplo, usando 'toISOString()' en ambas fechas en Firefox genera '' 2015-04-21T04: 56: 42.000Z "' y '" 2015-04-21T04: 56: 42.337Z "' – crudh

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

Me gusta esta solución la mejor. – A1rPun

+0

Muy precisa y limpia :) – robinmitra

+8

Excepto que tendrás que explicar qué le está haciendo esa magia '+' a cualquiera excepto a los expertos de JS. –

1

Si vas a añadir clon Fecha prototipo, entonces puede que desee para que sea no numerable ...

Date.prototype = Object.defineProperty(Date.prototype, "clone", { 
     value: function (fromDate) { return new Date(fromDate.valueOf()); } 
    });