2014-12-08 23 views
23

Sto usando Moment.js nel mio progetto e la formattazione date come segue:Locale e il formato data e con Moment.js

var locale = window.navigator.userLanguage || window.navigator.language; 
moment.locale(locale); 
someDate.format("L"); 

Funziona bene, ma a volte ho bisogno di mostrare una data senza anno. Non riesco a utilizzare qualcosa come someDate.format("MM/DD") perché in alcune lingue dovrebbe essere someDate.format("DD/MM"). Ho bisogno che qualcosa pensi come L,LL,LLL ma senza anno.

Cosa posso fare?

LTS : 'h:mm:ss A', 
LT : 'h:mm A', 
L : 'MM/DD/YYYY', 
LL : 'MMMM D, YYYY', 
LLL : 'MMMM D, YYYY LT', 
LLLL : 'dddd, MMMM D, YYYY LT' 

risposta

17

OK. Questo è un po 'orribile, ma tu sapevi che sarebbe stato.

In primo luogo, è possibile accedere alla stringa di formato effettivo per (ad esempio) 'L':

var formatL = moment.localeData().longDateFormat('L'); 

Avanti, è possibile eseguire alcuni interventi di chirurgia su di esso con giudizioso sostituzione regex:

var formatYearlessL = formatL.replace(/Y/g,'').replace(/^\W|\W$|\W\W/,''); 

(Quale è quello di dire: Rimuovere YYYY, più il separatore orfano lasciato dalla sua rimozione)

Quindi è possibile utilizzare la nuova stringa di formato in una chiamata di formato momento:

someDate.format(formatYearlessL); 

Questo rende necessariamente alcune ipotesi:

  • L'ordine del mese + giorno formato numerico per un locale corrisponde all'ordine per il formato giorno dell'anno + mese + per quella locale, con l'anno rimosso .
  • Il modulo breve utilizza i separatori solo tra il mese e il giorno (nessun separatore iniziale/finale).
  • Il separatore per un breve formato di data numerico è sempre non alfanumerico.
  • Il formato è costituito da elementi numerici e separatori, piuttosto che un formato di forma di frase con articoli (vedere il commento di RGPT in basso su spagnolo e portoghese, che si applicherà anche ai formati lunghi in alcune altre lingue).

Su una rapida recensione di locale/*.js, questi presupposti sono validi per ogni file di locale che ho esaminato, ma potrebbero esserci alcune impostazioni locali che violano tali file. (ETA: un commento qui sotto fa notare che un formato di data breve tedesco viola la seconda ipotesi)

Come ulteriore avvertenza importante, questo è probabile che sia fragile. È del tutto possibile che una versione futura di moment.js cambierà la posizione dei dati attualmente in longDateFormat ...

+0

sono d'accordo con te, sembra che sia un modo unico per ora. Spero che aggiungeranno altri formati in futuro. – Jekyll

+5

Questo non funzionerà in diverse culture. Prendiamo il portoghese come esempio: La data completa sarà: "14 de Fevereiro de 2016".Se rimuovi solo l'anno, in questo caso "2016", otterrai "14 de Fevereiro de" che è sbagliato. Il risultato corretto dovrebbe essere "14 de Fevereiro". Almeno lo spagnolo condivide lo stesso problema (quindi con questi due stiamo già parlando di più di 650 milioni di utenti possibili colpiti da questo bug). Vedo che le altre lingue avranno lo stesso problema. – RGPT

+1

RGPT - buon punto, modificato il post per aggiungerlo agli avvertimenti. In generale, questo approccio sarà appropriato solo quando si modifica un breve formato di data numerico con un separatore prevedibile. –

1

Per quanto ho capito, è possibile modificare il formato della data (senza anno) per lingue specifiche utilizzando MomentJS proprietà https://momentjs.com/docs/#/customization/long-date-formats/

Esempio:

moment.updateLocale('en', { 
    longDateFormat: { 
    LLL: "MMMM Do, LT", // Oct 6th, 4:27 PM 
    } 
}); 

moment.updateLocale('ru', { 
    longDateFormat: { 
    LLL : 'D MMMM, HH:mm', // 6 окт., 16:27 
    } 
}); 
Problemi correlati