Jak przekonwertować znacznik czasu unixa na datę kalendarza moment.js


141

Mam uniksowy znacznik czasu i próbuję przekształcić go w datę kalendarzową, taką jak MM/DD/YYYY. Jak dotąd mam to:

$(document).ready(function() {
  var value = $("#unixtime").val(); //this retrieves the unix timestamp
  var dateString = moment(value).calendar(); 
  alert(dateString);
});

Kiedy próbuję wydrukować datę z kalendarza, w oknie pojawia się komunikat „Nieprawidłowa data”. Czy ktoś może mi pomóc?

Odpowiedzi:


364

Używając momentu.js, jak pytałeś, istnieje unixmetoda, która akceptuje unixowe znaczniki czasu w sekundach:

var dateString = moment.unix(value).format("MM/DD/YYYY");

3
To nie jest data kalendarzowa.
Ian Warburton

1
@IanWarburton - to nie jest ??
Matt Johnson-Pint

Przypuszczam, że jest to zgodne z pytaniem. Ale myślę, że data kalendarzowa w moment.js wygląda tak ... moment (new Date (item.date)). Calendar ()
Ian Warburton

5
@IanWarburton - Nie potrzebujesz tam nowego obiektu daty. calendarFunkcja jest ładne ( docs tutaj ), ale nie w formacie PO prosił.
Matt Johnson-Pint

1
Warto zauważyć, dlaczego pytanie zawodzi, ale to działa. Powodem jest to, monent(number) przewiduje znacznik czasu Unix milisekund sekund (który jest zgodny z Dateobiektem), podczas gdy znacznik czasu UNIX w sekundach domyślnie. Więc możesz też zrobić moment(value*1000)zamiast moment.unix(value), ale użycie unixjest jaśniejsze.
icc97

39

Znacznik czasu UNIX to liczba sekund od 1970 roku, więc musisz przekonwertować go na obiekt JS Date:

var date = new Date(unixTimestamp*1000);

Tak, to było rozwiązanie z najnowszą wersją Moment, a przynajmniej taką, którą ostatnio dostałem od npm. mimo że otrzymałem .unix () od momentu, w którym musiałem * 1000 podczas ponownego tworzenia instancji. na przykład: moment (moment (). unix () * 1000)
kroe

Najlepsza odpowiedź w porównaniu z logiką moment.js
Andris


4
new moment(timeStamp,'yyyyMMddHHmmssfff').toDate()

9
Chociaż ten kod może odpowiedzieć na pytanie, lepiej byłoby uwzględnić kontekst, wyjaśnić, jak to działa i opisać, kiedy go używać. Odpowiedzi zawierające tylko kod nie są przydatne na dłuższą metę. Ponadto Twój kod nie jest poprawnie sformatowany.
ryanyuyu


3

Może się trochę spóźnić, ale w przypadku nowych problemów, takich jak ten, używam tego kodu:

moment(timestamp, 'X').format('lll');

Możesz zmienić format, aby dopasować go do swoich potrzeb, a także dodać strefę czasową w następujący sposób:

moment(timestamp, 'X').tz(timezone).format('lll');

1
To najlepsza metoda, jaką tu widziałem.
LukeVenter

1
Wystarczy dodać do tej odpowiedzi (która jest tutaj najbardziej poprawną odpowiedzią). Użyj małych liter xdla sygnatury czasowej ms unix. Dokumentacja tutaj
JonTroncoso

0

Naprawiłem to w ten sposób.

$scope.myCalendar = new Date(myUnixDate*1000);
<input date-time ng-model="myCalendar" format="DD/MM/YYYY" />

0
$(document).ready(function() {
    var value = $("#unixtime").val(); //this retrieves the unix timestamp
    var dateString = moment(value, 'MM/DD/YYYY', false).calendar(); 
    alert(dateString);
});

Istnieje tryb ścisły i tryb przebaczenia .

Chociaż tryb ścisły działa lepiej w większości sytuacji, tryb wybaczania może być bardzo przydatny, gdy format ciągu przekazywanego do chwili może się różnić.

W późniejszej wersji parser będzie domyślnie używać trybu ścisłego. Tryb ścisły wymaga, aby dane wejściowe do momentu dokładnie pasowały do ​​określonego formatu, w tym separatorów. Tryb ścisły jest ustawiany przez przekazanie true jako trzeciego parametru do funkcji momentowej.

Typowy scenariusz, w którym tryb wybaczania jest przydatny, występuje w sytuacjach, gdy interfejs API innej firmy podaje datę, a format daty dla tego interfejsu API może się zmienić. Załóżmy, że interfejs API zaczyna się od wysłania dat w formacie „RRRR-MM-DD”, a później zmienia się na format „MM / DD / RRRR”.

W trybie ścisłym następujący kod powoduje wyświetlenie „Nieprawidłowa data”:

moment('01/12/2016', 'YYYY-MM-DD', true).format()
"Invalid date"

W trybie wybaczania przy użyciu ciągu formatu otrzymujesz niewłaściwą datę:

moment('01/12/2016', 'YYYY-MM-DD').format()
"2001-12-20T00:00:00-06:00"

byłby inny sposób

$(document).ready(function() {
    var value = $("#unixtime").val(); //this retrieves the unix timestamp
    var dateString = moment.unix(value).calendar(); 
    alert(dateString);
});

0

Ta funkcja tworzy datę na podstawie znacznika czasu:

    function formatDateTime(dateString) {
        const parsed = moment(new Date(dateString))

        if (!parsed.isValid()) {
            return dateString
        }

        return parsed.format('MMM D, YYYY, HH:mmA')
    }


0
moment(timestamp).format('''any format''')

3
Chociaż ten kod może rozwiązać problem PO, najlepiej jest dołączyć wyjaśnienie, w jaki sposób Twój kod rozwiązuje problem PO. W ten sposób przyszli odwiedzający mogą uczyć się z Twojego postu i zastosować go do własnego kodu. SO nie jest usługą programistyczną, ale źródłem wiedzy. Również wysokiej jakości, kompletne odpowiedzi mają większe szanse na głosowanie. Te funkcje, wraz z wymogiem, aby wszystkie posty były samodzielne, są jednymi z mocnych stron SO jako platformy, która odróżnia ją od forów. Możesz edytować, aby dodać dodatkowe informacje i / lub uzupełnić wyjaśnienia o dokumentację źródłową.
ysf
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.