2012-05-03 14 views
28

Powiel możliwe:
Extending JavaScript's Date.parse to allow for DD/MM/YYYY (non-US formatted dates)?
Convert dd-mm-yyyy string to datejak do analizowania "dd/mm/rrrr" lub "dd-mm-rrrr" lub "dd-mmm-rrrr" sformatowana datę ciąg przy użyciu JavaScript lub jQuery

zamieścił datę w polu tekstowym, na przykład: 05/09/1985 i chciałem, aby przekształcić go 05-Sep-1985 formacie (dd-MMM-rrrr). Jak to osiągnąć? Zauważ, że format źródłowy może mieć format dd-mm-yyyy lub dd/mm/yyyy lub dd-mmm-yyyy.

Code Snippet:

function GetDateFormat(controlName) { 
     if ($('#' + controlName).val() != "") {  
      var d1 = Date.parse($('#' + controlName).val()); 
      if (d1 == null) { 
       alert('Date Invalid.'); 
       $('#' + controlName).val(""); 
      } 
       var array = d1.toString('dd-MMM-yyyy'); 
       $('#' + controlName).val(array); 
     } 
    } 

Ten kod zwraca 09-maj-1985 ale chcę 05-Sep-1985. Dzięki.

Odpowiedz

39

Możesz chcieć użyć biblioteki pomocnika jak http://momentjs.com/ który owija rodzimych javascript data obiekt dla łatwiejszej manipulacji

Następnie można robić takie rzeczy jak:

var day = moment("12-25-1995", "MM-DD-YYYY"); 

lub

var day = moment("25/12/1995", "DD/MM/YYYY"); 

następnie działać w dniu

day.add('days', 7) 

i uzyskać natywny javascript data

day.toDate(); 
31

Aktualizacja

Poniżej powiedziałeś:

Niestety, nie mogę wcześniej przewidzieć format daty, powinno być jak dd-mm-rrrr lub dd/mm/rrrr lub Format dd-mmm-yyyy w końcu chciałem przekonwertować cały ten format na format dd-MMM-rrrr.

To całkowicie zmienia pytanie. Będzie to o wiele bardziej skomplikowane, jeśli nie będziesz w stanie kontrolować formatu. W JavaScript nie ma nic, co pozwoli ci określić format daty. Oficjalnie jedynym formatem daty obsługiwanym przez JavaScript jest simplified version of ISO-8601: yyyy-mm-dd, chociaż w praktyce prawie wszystkie przeglądarki obsługują również yyyy/mm/dd. Ale poza tym musisz napisać kod samodzielnie lub (i to ma o wiele więcej sensu) korzystać z dobrej biblioteki. Prawdopodobnie użyłbym biblioteki takiej jak moment.js lub DateJS (chociaż DateJS nie było utrzymywane w latach).


Original odpowiedź:

Jeśli format jest zawszedd/mm/yyyy, to jest trywialne:

var parts = str.split("/"); 
var dt = new Date(parseInt(parts[2], 10), 
        parseInt(parts[1], 10) - 1, 
        parseInt(parts[0], 10)); 

split dzieli ciąg na danym ogranicznik. Następnie używamy parseInt do konwersji łańcuchów na liczby i używamy konstruktora new Date do zbudowania Date z tych części: Trzecią częścią będzie rok, druga część miesiąca i pierwsza część dnia. Date używa zerowych numerów miesięcy, więc musimy odjąć jeden od numeru miesiąca.

+0

Niestety, nie mogę wcześniej przewidzieć format daty, powinno być na przykład format dd-mm-rrrr lub dd/mm/rrrr lub dd-mmm-rrrr w końcu chciałem przekonwertować cały ten format na format dd-MMM-rrrr. –

+0

@SharanammaJekeen: To ** całkowicie ** zmienia pytanie. Zobacz aktualizację. –

+0

Naprawię mój format źródłowy do formatu dd/mm/rrrr. –

7

Date.parse rozpoznaje tylko określone formaty i nie ma możliwości poinformowania go o tym, jaki jest format wejściowy. W tym przypadku uważa, że ​​dane wejściowe mają format mm/dd/yyyy, więc wynik jest nieprawidłowy.

Aby rozwiązać ten problem, trzeba albo do analizowania wejściu siebie (na przykład z String.split), a następnie manually constructDate obiekt lub użyć bardziej pełni funkcjonalny biblioteki takie jak datejs.

przykład do ręcznego parsowania:

var input = $('#' + controlName).val(); 
var parts = str.split("/"); 
var d1 = new Date(Number(parts[2]), Number(parts[1]) - 1, Number(parts[0])); 

przykład stosując date.js:

var input = $('#' + controlName).val(); 
var d1 = Date.parseExact(input, "d/M/yyyy"); 
+0

to jak mogę osiągnąć powyższy format? –

+0

@SharanammaJekeen: Nie jestem pewien co masz na myśli ... – Jon

+1

date.js jest przydatny! – yorkw

2

Spróbuj tego:

function GetDateFormat(controlName) { 
     if ($('#' + controlName).val() != "") {  
      var d1 = Date.parse($('#' + controlName).val().toString().replace(/([0-9]+)\/([0-9]+)/,'$2/$1')); 
      if (d1 == null) { 
       alert('Date Invalid.'); 
       $('#' + controlName).val(""); 
      } 
       var array = d1.toString('dd-MMM-yyyy'); 
       $('#' + controlName).val(array); 
     } 
    } 

RegExp zastąpić .replace(/([0-9]+)\/([0-9]+)/,'$2/$1') zmiana dzień/miesiącu.

+0

Dobre wykorzystanie wyrażenia "RegEx". –

0

Zobacz ten

można zrobić coś z datą.

file: http://stevenlevithan.com/assets/misc/date.format.js

dodać do kodu HTML za pomocą znacznika script i używać można go używać jako:

var now = new Date(); 

now.format("m/dd/yy"); 
// Returns, e.g., 6/09/07 
+0

http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers –

+1

Proszę dodać komentarz - głosować tak, aby co najmniej mogę poznać mój błąd –

+0

Chyba dlatego, że OP zapytał, jak PARSE przekazać datę, do postaci "dd/mm/rrrr", a twoja odpowiedź wydaje się być o tym, jak sformatować bieżącą datę - może? –

Powiązane problemy