2014-12-08 14 views
23

używam Moment.js w moim projekcie i formatowania dat następująco:Locale i specyficzny format daty z Moment.js

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

To działa dobrze, ale czasami muszę pokazać datę bez roku. Nie mogę użyć czegoś takiego jak someDate.format("MM/DD"), ponieważ w niektórych językach powinno to być someDate.format("DD/MM"). Potrzebuję czegoś takiego, jak L,LL,LLL, ale bez roku.

Co mogę zrobić?

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' 

Odpowiedz

17

OK. To trochę okropne, ale wiedziałeś, że tak będzie.

Po pierwsze, można uzyskać dostęp do rzeczywistej ciąg formatu do (na przykład) 'L':

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

Następnie można wykonać jakąś operację na nim rozsądny zamiennik regex:

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

(co to znaczy: Usuń YYYY plus osierocony separator pozostawiony po usunięciu)

Następnie możesz użyć nowego ciągu formatu w formacie czasu:

someDate.format(formatYearlessL); 

To niekoniecznie sprawia, że ​​niektóre założenia:

  • Kolejność miesiąc + dzień formacie numerycznym dla lokalizacji mecze kolejność za rok + miesiąc + formacie dzień dla tej lokalizacji, z roku usunięto .
  • W krótkiej postaci używane są separatory tylko między miesiącem a dniem (bez separatorów wiodących/końcowych).
  • Separator dla krótkiego formatu daty numerycznej jest zawsze nie alfanumeryczny.
  • Format składa się z elementów numerycznych i separatorów, a nie z formatu zdań w formie zdań z artykułami (patrz komentarz RGPT poniżej o hiszpańskim i portugalskim, który będzie również dotyczył długich formatów w niektórych innych językach).

W krótkim przeglądzie locale/*.js te założenia są prawdziwe dla każdego pliku lokalizacji, który sprawdziłem, ale mogą występować pewne ustawienia regionalne, które je naruszają. (ETA: komentarz poniżej wskazuje, że niemiecki krótki format daty narusza drugie założenie). Jest całkowicie możliwe, że przy przyszłej wersji pliku moment.js zmieni się lokalizacja danych w obecnie longDateFormat ...

+0

jestem zgadzam się z tobą, wygląda to jeden sposób na teraz. Mam nadzieję, że dodadzą więcej formatów w przyszłości. – Jekyll

+5

To nie zadziała w kilku kulturach. Weźmy przykład Portugalii: Pełna data będzie: "14 de Fevereiro de 2016".Jeśli po prostu usuniesz rok, w tym przypadku "2016", otrzymasz: "14 de Fevereiro de", który jest błędny. Poprawny wynik powinien brzmieć "14 de Fevereiro". Przynajmniej hiszpański ma ten sam problem (tak więc z tymi dwoma rozmawiamy już o ponad 650m możliwych użytkownikach dotkniętych tym błędem). Widzę, że inne języki będą miały ten sam problem. – RGPT

+1

RGPT - dobra rada, zredagowano post, aby dodać to do zastrzeżeń. Zasadniczo to podejście będzie odpowiednie tylko wtedy, gdy zmienisz krótki, numeryczny format daty z przewidywalnym separatorem. –

1

O ile rozumiem, możesz zmienić format daty (bez roku) dla konkretnych języków za pomocą MomentJS właściwości https://momentjs.com/docs/#/customization/long-date-formats/

Przykład:

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 
    } 
});