Formatee la fecha de JavaScript como aaaa-mm-dd

383

Tengo una cita con el formato Sun May 11,2014. ¿Cómo puedo convertirlo a 2014-05-11JavaScript?

function taskDate(dateMilli) {
    var d = (new Date(dateMilli) + '').split(' ');
    d[2] = d[2] + ',';

    return [d[0], d[1], d[2], d[3]].join(' ');
}

var datemilli = Date.parse('Sun May 11,2014');
console.log(taskDate(datemilli));

El código anterior me da el mismo formato de fecha, sun may 11,2014. ¿Cómo puedo arreglar esto?

usuario3625547
fuente
77
Dudo que el código anterior le dé algo más que un error de sintaxis.
plalx
Realmente considere usar una biblioteca como Moment.js. Se formateará en el resultado deseado :)
Ankur
55
¿Por qué usar una biblioteca cuando 5 líneas de código pueden hacer el trabajo? @Ankur
Black Mamba
Relacionado: ¿Qué son las cadenas de fecha y hora válidas en JavaScript? Tenga en cuenta que "Sun May 11,2014" no es una cadena de fecha válida y el análisis puede fallar en algunos navegadores.
str

Respuestas:

525

Tu puedes hacer:

function formatDate(date) {
    var d = new Date(date),
        month = '' + (d.getMonth() + 1),
        day = '' + d.getDate(),
        year = d.getFullYear();

    if (month.length < 2) 
        month = '0' + month;
    if (day.length < 2) 
        day = '0' + day;

    return [year, month, day].join('-');
}

Ejemplo de uso:

alert(formatDate('Sun May 11,2014'));

Salida:

2014-05-11

Demostración en JSFiddle: http://jsfiddle.net/abdulrauf6182012/2Frm3/

usuario3470953
fuente
11
¿Realmente múltiples declaraciones de variables en la misma declaración? stackoverflow.com/questions/694102/…
bhspencer
8
@ Fuser97381 Las declaraciones de variables múltiples en la misma declaración son más que una simple preferencia de estilo estético. Es una práctica peligrosa. Si falla inadvertidamente, agregue una coma después de cada declaración y termine creando variables globales. No es algo que deba alentarse sobre lo que puede convertirse en la respuesta canónica a una pregunta.
bhspencer
66
'use strict';@bhspencer
Vix
3
El formateo de una cadena de fecha no debe depender del análisis exitoso de cadenas no estándar por parte del analizador incorporado. Dado el formato OP, puede formatearse en menos código sin usar una fecha.
RobG
¿Cómo incrementar más 30 días en el rango 1 ~ 31?
Steve Angello
456

Simplemente aproveche el toISOStringmétodo incorporado que lleva su fecha al formato ISO 8601:

yourDate.toISOString().split('T')[0]

Donde yourDate es su objeto de fecha.

Editar: un tipo escribió esto para manejar la zona horaria en los comentarios:

const offset = yourDate.getTimezoneOffset()
yourDate = new Date(yourDate.getTime() + (offset*60*1000))
return yourDate.toISOString().split('T')[0]
Darth Egregious
fuente
239
Tenga cuidado con este método, ya que primero convierte a la fecha a UTC. Si está en una zona horaria + y su porción de tiempo es temprano en el día, entonces podría retroceder un día. Alternativamente, si está en una zona horaria y su porción de tiempo es tarde en el día, entonces podría avanzar un día.
Luke Baulch
44
Pruebe esto en su lugar:new Date(yourDateStr).toISOString().split('T')[0]
exbuddha
24
const offset = yourDate.getTimezoneOffset(); yourDate = new Date(yourDate.getTime() + (offset*60*1000)); yourDate.toISOString().split('T')[0] esto debería resolver el problema de la zona horaria
mjwrazor
55
now.toISOString().substring(0,10); Esta es una alternativa más limpia, ya que te recuerda que YYYY-MM-DDson los primeros diez caracteres del formato iso completo
Gutimore
44
Nota: usando la solución útil comentada por @mjwrazor, tuve que restar en lugar de agregar el desplazamiento para obtener la fecha correcta (cambiar la + (offseta - (offset)
rococó
135

Utilizo esta forma para obtener la fecha en formato aaaa-mm-dd :)

var todayDate = new Date().toISOString().slice(0,10);
Fernando Aguilar
fuente
14
¿Cómo manejas el cambio de fecha por un día como se menciona aquí por @Luke_Baulch?
Malvineous
77
Puede hacer esto: var todayDate = new Date (); todayDate.setMinutes (todayDate.getMinutes () - todayDate.getTimezoneOffset ()); todayDate.toISOString (). slice (0,10); Esto debería ayudar a evitar el problema UTC.
Fernando Aguilar
1
@FernandoAguilar Sin embargo, una duda, ¿cómo sabemos que necesitamos restar el desplazamiento o agregarlo?
whyAto8
var todayDate = new Date(2018, 3 - 1, 26); todayDate.toISOString().slice(0, 10);me da "2018-03-25". En otro sistema var todayDate = new Date(2018, 3 - 1, 26, 17, 0, 0); todayDate.toISOString().slice(0, 10);me da "2018-03-27".
Salman A
2
No siempre funciona A veces resta un día debido a la conversión UTC.
NickG
110

La forma más sencilla de convertir su fecha al formato aaaa-mm-dd es hacer esto:

var date = new Date("Sun May 11,2014");
var dateString = new Date(date.getTime() - (date.getTimezoneOffset() * 60000 ))
                    .toISOString()
                    .split("T")[0];

Cómo funciona:

  • new Date("Sun May 11,2014")convierte la cadena "Sun May 11,2014"en un objeto de fecha que representa la horaSun May 11 2014 00:00:00 en una zona horaria basada en la configuración regional actual (configuración del sistema host)
  • new Date(date.getTime() - (date.getTimezoneOffset() * 60000 )) convierte su fecha en un objeto de fecha que corresponde con la hora Sun May 11 2014 00:00:00 en UTC (hora estándar) restando el desplazamiento de zona horaria
  • .toISOString() convierte el objeto de fecha en una cadena ISO 8601 2014-05-11T00:00:00.000Z
  • .split("T") divide la cadena en matriz ["2014-05-11", "00:00:00.000Z"]
  • [0] toma el primer elemento de esa matriz

Manifestación

var date = new Date("Sun May 11,2014");
var dateString = new Date(date.getTime() - (date.getTimezoneOffset() * 60000 ))
                    .toISOString()
                    .split("T")[0];

console.log(dateString);

John Slegers
fuente
20
¿Nadie más está horrorizado de que esta sea la forma más simple?
brecha
Sin embargo, .toISOString () no funciona correctamente con el horario de verano.
Ideas de Joe
2
@ JoeDevmon: No veo cómo eso es relevante aquí. El - (date.getTimezoneOffset() * 60000 )bit debería eliminar cualquier diferencia de zona horaria, incluido el impacto del horario de verano.
John Slegers el
2
@JohnSlegers, eso era lo que estaba pensando, pero todavía estaba recibiendo el día anterior en algunos casos. Refactoré y tu ejemplo funciona ahora. Debo haber tenido una cadena de fecha extraña o algo así. Gracias por seguir y señalarlo. +1 👍
Ideas de Joe
2
He buscado por todo lo alto y bajo en SO y otros sitios para encontrar la mejor manera de lidiar con los problemas de zona horaria con fechas en JS, y sin dudas, este es, con mucho, el mejor y el más fácil. ¡Gracias!
HartleySan
34
format = function date2str(x, y) {
    var z = {
        M: x.getMonth() + 1,
        d: x.getDate(),
        h: x.getHours(),
        m: x.getMinutes(),
        s: x.getSeconds()
    };
    y = y.replace(/(M+|d+|h+|m+|s+)/g, function(v) {
        return ((v.length > 1 ? "0" : "") + eval('z.' + v.slice(-1))).slice(-2)
    });

    return y.replace(/(y+)/g, function(v) {
        return x.getFullYear().toString().slice(-v.length)
    });
}

Resultado:

format(new Date('Sun May 11,2014'), 'yyyy-MM-dd')
"2014-05-11
orangleliu
fuente
1
Me gusta la flexibilidad adicional que ofrece esta solución sobre las otras respuestas a esta pregunta. No lo he probado completamente, pero para el formato que deseaba (es decir, "aaaa-MM-dd hh: mm: ss"), funciona exactamente como se esperaba.
porcus
3
Podrías evitarlo fácilmente eval.
Salman A
3
aquí hay una versión que evita la evaluación y comenta mejor jsfiddle.net/8904cmLd/2
m1m1k
2
Me beneficié de esta respuesta. Reemplacé esa línea con la declaración eval areturn ((v.length > 1 ? "0" : "") + z[v.slice(-1)]).slice(-2);
JesusIsMyDriver.dll
26

Una combinación de algunas de las respuestas:

var d = new Date(date);
date = [
  d.getFullYear(),
  ('0' + (d.getMonth() + 1)).slice(-2),
  ('0' + d.getDate()).slice(-2)
].join('-');
aqwsez
fuente
Me gusta más la solución: fácil de leer, y no depende de toISOString()las posibles dificultades de la zona horaria con el uso de esa función.
matt.fc
Este es el primero que no hace que me duela el cerebro.
ckapilla
22

Si no tiene nada en contra del uso de bibliotecas, puede usar la biblioteca Moments.js de esta manera:

var now = new Date();
var dateString = moment(now).format('YYYY-MM-DD');

var dateStringWithTime = moment(now).format('YYYY-MM-DD HH:mm:ss');
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>

Nifemi Sola-Ojo
fuente
Solución genial, pero es un paquete de 300 kb
Adam
13

Simplemente use esto:

var date = new Date('1970-01-01'); // Or your date here
console.log((date.getMonth() + 1) + '/' + date.getDate() + '/' +  date.getFullYear());

Simple y dulce;)

Pardeep Jain
fuente
44
el relleno no está disponible para el formato de 2 letras. mostrará un solo dígito si la fecha o el mes es inferior a 10, por eso no se puede usar esto directamente.
Yatender Singh
Sí, pero eso se puede lograr simplemente usando JavaScript, creo que es totalmente su requisito, ¿no? @YatenderSingh
Pardeep Jain
44
sí correcto, pero verifique el título de la pregunta "aaaa-mm-dd" formato que quiere :)
Yatender Singh
var old_date = nueva Fecha (fecha); var new_date = old_date.getFullYear () + '-' + (old_date.getMonth () + 1) + '-' + old_date.getDate ()
Sitti Munirah Abdul Razak
1
Excelente. ¡Funcionó y fue simple y conciso!
Waleed93
12

toISOString()asume que su fecha es la hora local y la convierte a UTC. Obtendrá una cadena de fecha incorrecta.

El siguiente método debería devolver lo que necesita.

Date.prototype.yyyymmdd = function() {         

    var yyyy = this.getFullYear().toString();                                    
    var mm = (this.getMonth()+1).toString(); // getMonth() is zero-based         
    var dd  = this.getDate().toString();             

    return yyyy + '-' + (mm[1]?mm:"0"+mm[0]) + '-' + (dd[1]?dd:"0"+dd[0]);
};

Fuente: https://blog.justin.kelly.org.au/simple-javascript-function-to-format-the-date-as-yyyy-mm-dd/

usuario1920925
fuente
9

Recupere año, mes y día, y luego póngalos juntos. Recto, simple y preciso.

function formatDate(date) {
    var year = date.getFullYear().toString();
    var month = (date.getMonth() + 101).toString().substring(1);
    var day = (date.getDate() + 100).toString().substring(1);
    return year + "-" + month + "-" + day;
}

//Usage example:
alert(formatDate(new Date()));

Luo Jiong Hui
fuente
9

Puedes usar toLocaleDateString('fr-CA')en Dateobjeto

console.log(new Date('Sun May 11,2014').toLocaleDateString('fr-CA'));

También descubrí que esas configuraciones regionales dan el resultado correcto de esta lista de configuraciones regionales Lista de todas las configuraciones regionales y sus códigos cortos.

'en-CA'
'fr-CA'
'lt-LT'
'sv-FI'
'sv-SE'

Aleksandr Belugin
fuente
¿Alguna idea de por qué esto funciona? ¿El formato ISO es solo el predeterminado, o estas configuraciones regionales realmente usan ese formato? Si es lo primero, me preocuparía que pueda cambiar inesperadamente en el futuro.
jymbob
Esto no funciona con NodeJS fuera del navegador.
Donato
@jymbob Creo que estos entornos locales utilizan realmente esos formatos. He llegado a la misma respuesta mirando esta página de Wikipedia: en.wikipedia.org/wiki/Date_format_by_country
Ciprian Tomoiagă
5

Para considerar también la zona horaria, esta línea única debería ser buena sin ninguna biblioteca:

new Date().toLocaleString("en-IN", {timeZone: "Asia/Kolkata"}).split(',')[0]
krsoni
fuente
5

Puedes probar esto: https://www.npmjs.com/package/timesolver

npm i timesolver

Úselo en su código:

const timeSolver = require('timeSolver');
const date = new Date();
const dateString = timeSolver.getString(date, "YYYY-MM-DD");

Puede obtener la cadena de fecha utilizando este método:

getString
sean1093
fuente
4

Ninguna de estas respuestas me satisfizo bastante. Quería una solución multiplataforma que me diera el día en la zona horaria local sin usar bibliotecas externas.

Esto es lo que se me ocurrió:

function localDay(time) {
  var minutesOffset = time.getTimezoneOffset()
  var millisecondsOffset = minutesOffset*60*1000
  var local = new Date(time - millisecondsOffset)
  return local.toISOString().substr(0, 10)
}

Eso debería devolver el día de la fecha, en formato AAAA-MM-DD, en la zona horaria que hace referencia la fecha.

Entonces, por ejemplo, localDay(new Date("2017-08-24T03:29:22.099Z"))volverá "2017-08-23"a pesar de que ya es el 24 en UTC.

Tendrá que polyfill Date.prototype.toISOString para que funcione en Internet Explorer 8, pero debe ser apoyado por todas partes.

Erik Pukinskis
fuente
Tal vez valga la pena señalar que solo le dará 2017-08-23 si está suficientemente detrás de UTC (por ejemplo, en los EE. UU.).
Simon D
3

Date.js es genial para esto.

require("datejs")
(new Date()).toString("yyyy-MM-dd")
Tan Wang
fuente
3

Sugiero usar algo como formatDate-js en lugar de intentar replicarlo cada vez. Simplemente use una biblioteca que admita todas las acciones principales de strftime.

new Date().format("%Y-%m-%d")
Michael Baldry
fuente
3
new Date().toLocaleDateString('pt-br').split( '/' ).reverse( ).join( '-' );

o

new Date().toISOString().split('T')[0]
new Date('23/03/2020'.split('/').reverse().join('-')).toISOString()
new Date('23/03/2020'.split('/').reverse().join('-')).toISOString().split('T')[0]

¡Prueba esto!

Williaan Lopes
fuente
La segunda opción puede mostrar la fecha incorrecta porque mostrará los datos en la zona horaria UTC.
Ever Dev
2

Aquí hay una forma de hacerlo:

var date = Date.parse('Sun May 11,2014');

function format(date) {
  date = new Date(date);

  var day = ('0' + date.getDate()).slice(-2);
  var month = ('0' + (date.getMonth() + 1)).slice(-2);
  var year = date.getFullYear();

  return year + '-' + month + '-' + day;
}

console.log(format(date));
Gergo Erdosi
fuente
1

function myYmd(D){
    var pad = function(num) {
        var s = '0' + num;
        return s.substr(s.length - 2);
    }
    var Result = D.getFullYear() + '-' + pad((D.getMonth() + 1)) + '-' + pad(D.getDate());
    return Result;
}

var datemilli = new Date('Sun May 11,2014');
document.write(myYmd(datemilli));

Andrei
fuente
1

var d = new Date("Sun May 1,2014");

var year  = d.getFullYear();
var month = d.getMonth() + 1;
var day   = d.getDate(); 

month = checkZero(month);             
day   = checkZero(day);

var date = "";

date += year;
date += "-";
date += month;
date += "-";
date += day;

document.querySelector("#display").innerHTML = date;
    
function checkZero(i) 
{
    if (i < 10) 
    {
        i = "0" + i
    };  // add zero in front of numbers < 10

    return i;
}
<div id="display"></div>

antílope
fuente
1
new Date(new Date(YOUR_DATE.toISOString()).getTime() - 
                 (YOUR_DATE.getTimezoneOffset() * 60 * 1000)).toISOString().substr(0, 10)
Lin
fuente
1

Algunas de las respuestas anteriores estaban bien, pero no eran muy flexibles. Quería algo que realmente pudiera manejar más casos extremos, así que tomé la respuesta de @orangleliu y la amplié. https://jsfiddle.net/8904cmLd/1/

function DateToString(inDate, formatString) {
    // Written by m1m1k 2018-04-05

    // Validate that we're working with a date
    if(!isValidDate(inDate))
    {
        inDate = new Date(inDate);
    }

    // See the jsFiddle for extra code to be able to use DateToString('Sun May 11,2014', 'USA');
    //formatString = CountryCodeToDateFormat(formatString);

    var dateObject = {
        M: inDate.getMonth() + 1,
        d: inDate.getDate(),
        D: inDate.getDate(),
        h: inDate.getHours(),
        m: inDate.getMinutes(),
        s: inDate.getSeconds(),
        y: inDate.getFullYear(),
        Y: inDate.getFullYear()
    };

    // Build Regex Dynamically based on the list above.
    // It should end up with something like this: "/([Yy]+|M+|[Dd]+|h+|m+|s+)/g"
    var dateMatchRegex = joinObj(dateObject, "+|") + "+";
    var regEx = new RegExp(dateMatchRegex,"g");
    formatString = formatString.replace(regEx, function(formatToken) {
        var datePartValue = dateObject[formatToken.slice(-1)];
        var tokenLength = formatToken.length;

        // A conflict exists between specifying 'd' for no zero pad -> expand
        // to '10' and specifying yy for just two year digits '01' instead
        // of '2001'.  One expands, the other contracts.
        //
        // So Constrict Years but Expand All Else
        if (formatToken.indexOf('y') < 0 && formatToken.indexOf('Y') < 0)
        {
            // Expand single digit format token 'd' to
            // multi digit value '10' when needed
            var tokenLength = Math.max(formatToken.length, datePartValue.toString().length);
        }
        var zeroPad = (datePartValue.toString().length < formatToken.length ? "0".repeat(tokenLength) : "");
        return (zeroPad + datePartValue).slice(-tokenLength);
    });

    return formatString;
}

Ejemplo de uso:

DateToString('Sun May 11,2014', 'MM/DD/yy');
DateToString('Sun May 11,2014', 'yyyy.MM.dd');
DateToString(new Date('Sun Dec 11,2014'),'yy-M-d');
m1m1k
fuente
Buena solución limpia y comentada. Sin embargo, soy escéptico sobre el primer argumento, que se reemplaza silenciosamente por una nueva fecha nueva si no se reconoce como una fecha válida. Prefiero poner esto "valor por defecto optionnal" como segundo argumento en su lugar, y devolver algún tipo de excepción (que podría ser un simple "formato de fecha no válido" cadena devuelta) en caso de que no se reconoce el formato, por lo que el error aparece claramente a el probador / usuario
Balmipour
1

Esto funcionó para mí para obtener la fecha actual en el formato deseado (AAAAMMDD HH: MM: SS):

var d = new Date();

var date1 = d.getFullYear() + '' +
            ((d.getMonth()+1) < 10 ? "0" + (d.getMonth() + 1) : (d.getMonth() + 1)) +
            '' +
            (d.getDate() < 10 ? "0" + d.getDate() : d.getDate());

var time1 = (d.getHours() < 10 ? "0" + d.getHours() : d.getHours()) +
            ':' +
            (d.getMinutes() < 10 ? "0" + d.getMinutes() : d.getMinutes()) +
            ':' +
            (d.getSeconds() < 10 ? "0" + d.getSeconds() : d.getSeconds());

print(date1+' '+time1);
Savia
fuente
1

No se necesita biblioteca

Solo JavaScript puro.

El siguiente ejemplo muestra los últimos dos meses a partir de hoy:

var d = new Date()
d.setMonth(d.getMonth() - 2);
var dateString = new Date(d);
console.log('Before Format', dateString, 'After format', dateString.toISOString().slice(0,10))

Panayiotis Georgiou
fuente
Peligroso. En ese caso, ignora el desplazamiento de la zona horaria.
maxence51
1

Formato de fecha compatible con PHP

Aquí hay una pequeña función que puede tomar los mismos parámetros que la función PHP date()y devolver una cadena de fecha / hora en JavaScript.

Tenga en cuenta que no todas las opciones de formato date () de PHP son compatibles. Puede extender el partsobjeto para crear el token de formato que falta

/**
 * Date formatter with PHP "date()"-compatible format syntax.
 */
const formatDate = (format, date) => {
  if (!format) { format = 'Y-m-d' }
  if (!date) { date = new Date() }

  const parts = {
    Y: date.getFullYear().toString(),
    y: ('00' + (date.getYear() - 100)).toString().slice(-2),
    m: ('0' + (date.getMonth() + 1)).toString().slice(-2),
    n: (date.getMonth() + 1).toString(),
    d: ('0' + date.getDate()).toString().slice(-2),
    j: date.getDate().toString(),
    H: ('0' + date.getHours()).toString().slice(-2),
    G: date.getHours().toString(),
    i: ('0' + date.getMinutes()).toString().slice(-2),
    s: ('0' + date.getSeconds()).toString().slice(-2)
  }

  const modifiers = Object.keys(parts).join('')
  const reDate = new RegExp('(?<!\\\\)[' + modifiers + ']', 'g')
  const reEscape = new RegExp('\\\\([' + modifiers + '])', 'g')

  return format
    .replace(reDate, $0 => parts[$0])
    .replace(reEscape, ($0, $1) => $1)
}

// ----- EXAMPLES -----
console.log( formatDate() ); // "2019-05-21"
console.log( formatDate('H:i:s') ); // "16:21:32"
console.log( formatDate('Y-m-d, o\\n H:i:s') ); // "2019-05-21, on 16:21:32"
console.log( formatDate('Y-m-d', new Date(2000000000000)) ); // "2033-05-18"

Esencia

Aquí hay un resumen con una versión actualizada de la formatDate()función y ejemplos adicionales: https://gist.github.com/stracker-phil/c7b68ea0b1d5bbb97af0a6a3dc66e0d9

Philipp
fuente
0

Otra combinación más de las respuestas. Muy bien legible, pero un poco largo.

function getCurrentDayTimestamp() {
  const d = new Date();

  return new Date(
    Date.UTC(
      d.getFullYear(),
      d.getMonth(),
      d.getDate(),
      d.getHours(),
      d.getMinutes(),
      d.getSeconds()
    )
  // `toIsoString` returns something like "2017-08-22T08:32:32.847Z"
  // and we want the first part ("2017-08-22")
  ).toISOString().slice(0, 10);
}
kadrian
fuente
0

Si la fecha debe ser la misma en todas las zonas horarias, por ejemplo, representa algún valor de la base de datos, asegúrese de utilizar las versiones UTC del día, mes, funciones fullear en el objeto de fecha JavaScript, ya que esto se mostrará en la hora UTC y evite errores fuera de uno en ciertas zonas horarias.

Aún mejor, use la biblioteca de fechas Moment.js para este tipo de formato.

GameSalutes
fuente
0

He modificado la respuesta de Samit Satpute de la siguiente manera:

var newstartDate = new Date();
// newstartDate.setDate(newstartDate.getDate() - 1);
var startDate = newstartDate.toISOString().replace(/[-T:\.Z]/g, ""); //.slice(0, 10); // To get the Yesterday's Date in YYYY MM DD Format
console.log(startDate);

suleman
fuente
0

Formato y búsqueda de fecha máxima y mínima a partir de datos de hashmap:

var obj = {"a":'2001-15-01', "b": '2001-12-02' , "c": '2001-1-03'};

function findMaxMinDate(obj){
  let formatEncode = (id)=> { let s = id.split('-'); return `${s[0]+'-'+s[2]+'-'+s[1]}`}
  let formatDecode = (id)=> { let s = id.split('/'); return `${s[2]+'-'+s[0]+'-'+s[1]}`}
  let arr = Object.keys( obj ).map(( key )=> { return new Date(formatEncode(obj[key])); });
  let min = new Date(Math.min.apply(null, arr)).toLocaleDateString();
  let max = new Date(Math.max.apply(null, arr)).toLocaleDateString();
  return {maxd: `${formatDecode(max)}`, mind:`${formatDecode(min)}`}
}

console.log(findMaxMinDate(obj));

KARTHIKEYAN.A
fuente
¿Cómo se relaciona esto con la pregunta (formatear una fecha)?
Peter Mortensen
0

Reformatear una cadena de fecha es bastante sencillo, p. Ej.

var s = 'Sun May 11,2014';

function reformatDate(s) {
  function z(n){return ('0' + n).slice(-2)}
  var months = [,'jan','feb','mar','apr','may','jun',
                 'jul','aug','sep','oct','nov','dec'];
  var b = s.split(/\W+/);
  return b[3] + '-' +
    z(months.indexOf(b[1].substr(0,3).toLowerCase())) + '-' +
    z(b[2]);
}

console.log(reformatDate(s));

RobG
fuente