Cambiar el formato de algunas cadenas

votos
1

Tengo cadenas en este formato:

Puntata del 16 Agosto 2018
Puntata del 17 Gennaio 2018
Puntata del 7 Novembre 2017
Puntata del 2 Gennaio 2013

Me gustaría conseguir:

20180816
20180117
20171107
20130102

¿Cómo puedo hacer eso?

Ese es el año, el mes (dos dígitos) y el día (dos dígitos).

Por año, es fácil: basta con tomar los últimos cuatro caracteres de la cadena, pero para el día y el mes?

Este es el código que estoy creando:

var newName = function(oldName) {
    var oldNameWithoutPuntata = oldName.substring(12);
    console.log('oldNameWithoutPuntata:', oldNameWithoutPuntata);

    var year = oldNameWithoutPuntata.substr(oldNameWithoutPuntata.length - 4);
    console.log('year:', year);

    // ...
    return year + month + day;
}

var test1 = 'Puntata del 16 Agosto 2018';
var test2 = 'Puntata del 17 Gennaio 2018';
var test3 = 'Puntata del 7 Novembre 2017';
var test4 = 'Puntata del 2 Gennaio 2013';
console.log(test1, '-->', newName(test1));
console.log(test2, '-->', newName(test2));
console.log(test3, '-->', newName(test3));
console.log(test4, '-->', newName(test4));
Publicado el 19/09/2018 a las 13:35
fuente por usuario
En otros idiomas...                            


3 respuestas

votos
1

Es posible eliminar algunos de los rebanar subcadena si se utiliza la RegExpfunción execque puede volver grupos de concordancia de una consulta aunque el primer elemento será el 'todo partido'.

Una vez que tenga una gran variedad de las piezas de fecha, lo que reduce de nuevo a una cadena en orden inverso se logra a través de la reduceRightfunción de matriz.

Tenga en cuenta que padStart es una función de cadena así que hay que convertir los números a cadenas primero. Esto se logra mediante la concatenación de ellas con una cadena vacía es decir, ('' + <number>).padStart(...)y hago uso de soportes para asegurar el orden de ejecución correcto de la declaración

let getMonthAsNumber = month => ['Gennaio', 'Febbraio', 'Marzo', 'Aprile', 'Maggio', 'Giugno', 'Luglio', 'Agosto', 'Settembre', 'Ottobre', 'Novembre', 'Dicembre'].indexOf(month)+1

var newName = oldName => /^Puntata del ([0-9]+)\s([^0-9\s]+)\s([0-9]+)$/gi.exec(oldName)
  // remove the first element of the match array - this is the whole match
  .slice(1)
  // use reduceRight to work along the rest of the match groups 'backwards'
  // apend the strings together and convert/pad as required
  .reduceRight((prev, cur) => prev + (''+(isNaN(cur)? // is 'cur' a string?
  getMonthAsNumber(cur) // yes - convert month to number
  : 
  cur // no - return number
  ))
  .padStart(2, '0'), '')

var test1 = 'Puntata del 16 Agosto 2018';
var test2 = 'Puntata del 17 Gennaio 2018';
var test3 = 'Puntata del 7 Novembre 2017';
var test4 = 'Puntata del 2 Gennaio 2013';
console.log(test1, '-->', newName(test1));
console.log(test2, '-->', newName(test2));
console.log(test3, '-->', newName(test3));
console.log(test4, '-->', newName(test4));

Respondida el 19/09/2018 a las 18:02
fuente por usuario

votos
1

Para alcanzar el resultado esperado, a continuación utilizar la opción de encontrar valor del mes de nombres de los meses matriz

  1. Meses utilizar Array para encontrar el valor de mes y darle formato para añadir '0', si es menor de 10
  2. Utilizando el método de división con el espacio (' '), la fecha puede dividido en fecha, mes, año
  3. meses formato para añadir '0', si es menor de 10

codepen de referencia - https://codepen.io/nagasai/pen/QVzqPZ?editors=1011

var newName = function(oldName) {
  var oldNameWithoutPuntata = oldName.substring(12);
  
  var months = ['Gennaio','Febbraio','Marzo', 'Aprile','Maggio','Giugno', 'Luglio', 'Agosto','Settembre', 'Ottobre', 'Novembre','Dicembre']
  
  var dateArr = oldNameWithoutPuntata.split(' ')
  
  var month = months.indexOf(dateArr[1]) + 1 
  month = month< 10 ? ('0' + month) : month
  var year = dateArr[2];
  var date = dateArr[0]
  date = date< 10 ? ('0' + date) : date
 
  return year + month + date;
}

var test1 = 'Puntata del 16 Agosto 2018';
var test2 = 'Puntata del 17 Gennaio 2018';
var test3 = 'Puntata del 7 Novembre 2017';
var test4 = 'Puntata del 2 Gennaio 2013';
console.log(test1, '-->', newName(test1));
console.log(test2, '-->', newName(test2));
console.log(test3, '-->', newName(test3));
console.log(test4, '-->', newName(test4));

Respondida el 19/09/2018 a las 14:50
fuente por usuario

votos
0

Puede utilizar padStart añadir 0 con mayor facilidad.

ver https://codepen.io/anon/pen/bxOvmy?editors=1011

var newName = function(oldName) {
    var parseDate = oldName.split(' ');
    var monthsList = ['Gennaio','Febbraio','Marzo', 'Aprile','Maggio','Giugno', 'Luglio', 'Agosto','Settembre', 'Ottobre', 'Novembre','Dicembre'];

    var month = monthsList.indexOf(parseDate[3]) + 1;
    month = month.toString().padStart(2, "0");
    var year = parseDate[4];
    var date = parseDate[2].padStart(2, "0");
 
    return year + month + date;
}

var test1 = 'Puntata del 16 Agosto 2018';
var test2 = 'Puntata del 17 Gennaio 2018';
var test3 = 'Puntata del 7 Novembre 2017';
var test4 = 'Puntata del 2 Gennaio 2013';
console.log(test1, '-->', newName(test1));
console.log(test2, '-->', newName(test2));
console.log(test3, '-->', newName(test3));
console.log(test4, '-->', newName(test4));

Respondida el 19/09/2018 a las 16:59
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more