2016-01-04 12 views
11

Próbuję sformatować ciąg danych Date w React Native.Formatowanie łańcucha daty w React Native

Ex: 2016-01-04 10:34:23

Poniżej przedstawiono kod używam.

var date = new Date("2016-01-04 10:34:23"); 
console.log(date); 

Moim problemem jest to, kiedy jestem emulacji to na iPhone 6S, to będzie drukować Mon Jan 04 2016 10:34:23 GMT+0530 (IST) bez żadnego problemu. Ale jeśli spróbuję z iPhone 5S, nic nie wypisze. A jeśli spróbujesz zdobyć miesiąc za pomocą metody takiej jak date.getMonth(), wydrukuje ona "NaN".

Dlaczego tak jest? Jakie jest obejście tego problemu?

+3

czy kiedykolwiek znaleźć rozwiązanie tego? –

Odpowiedz

31

piękno React Native jest to, że obsługuje wiele JS Librarieis jak Moment.js. Korzystanie moment.js byłby lepszy/łatwiejszy sposób obsłużyć datę/godzinę zamiast kodowania od podstaw

wystarczy uruchomić to w terminalu:

npm install moment --save 

iw swoim React Native js strony:

import Moment from 'moment'; 

render(){ 
    Moment.locale('en'); 
    var dt = '2016-05-02T00:00:00'; 
    return(<View> {Moment(dt).format('d MMM')} </View>) //basically you can do all sorts of the formatting and others 
} 

Możesz sprawdzić moment.js offical w docs tutaj https://momentjs.com/docs/

1

Konstruktor daty jest bardzo wybredny, jeśli chodzi o to, na co pozwala. Ciąg, który przekazujesz, musi być obsługiwany przez funkcję Date.parse(), a jeśli nie jest obsługiwana, zwróci wartość NaN. Różne wersje JavaScript obsługują różne formaty, jeśli formaty te różnią się od oficjalnej dokumentacji ISO.

Zobacz przykłady tutaj co jest obsługiwany: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse

3

nie ma potrzeby, aby zawierać bul ky biblioteka taka jak Moment.js naprawia taki prosty problem.

Problem, przed którym stoisz, nie jest związany z formatowaniem, ale z analizą.

Jak wspomina John Shammas w innej odpowiedzi, konstruktor Date (i Date.parse) są wrażliwi na temat danych wejściowych. Twój 2016-01-04 10:34:23 może działać w jednej implementacji JavaScript, ale niekoniecznie w drugiej.

According to the specification of ECMAScript 5.1, Date.parse obsługuje (uproszczenie) ISO 8601. To dobra wiadomość, ponieważ Twoja data jest już bardzo podobna do ISO 8601.

Wszystko, co musisz zrobić, to zmienić format wejściowy tylko trochę. Zamień miejsce na T: 2016-01-04T10:34:23; i opcjonalnie dodaj strefę czasową (2016-01-04T10:34:23+01:00), w przeciwnym razie przyjęto UTC.

1
function getParsedDate(date){ 
    date = String(date).split(' '); 
    var days = String(date[0]).split('-'); 
    var hours = String(date[1]).split(':'); 
    return [parseInt(days[0]), parseInt(days[1])-1, parseInt(days[2]), parseInt(hours[0]), parseInt(hours[1]), parseInt(hours[2])]; 
} 
var date = new Date(...getParsedDate('2016-01-04 10:34:23')); 
console.log(date); 

powodu różnic w przetwarzaniu łańcuchach daty, zaleca się, aby zawsze ręcznie analizowania ciągów jako wyniki są niespójne, szczególnie całej różne implementacje ECMAScript gdzie ciągi jak „12.10.2015 12 : 00: 00 "może być analizowany jako strefa czasowa NaN, UTC lub lokalna .

... jak to opisano w zasobie:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse