Jak przekonwertować datę na znacznik czasu?

165

Chcę przekonwertować datę na znacznik czasu, moje dane wejściowe to 26-02-2012. użyłem

new Date(myDate).getTime();

Jest napisane NaN .. Czy ktoś może powiedzieć, jak to przekonwertować?

selladurai
źródło
możliwy duplikat stackoverflow.com/questions/9343971/ ...
Bogdan Emil Mariesan
możesz zajrzeć do biblioteki date.js
rsbarro
1
Czy użyłeś Date(myDate).getTime()(tego, co oznaczyłeś jako kod), czy też słowo „nowy” przed nim ma być częścią kodu? Im więcej wysiłku włożysz, tym lepsze będą odpowiedzi.
TJ Crowder
@rsbarro: Z wyjątkiem tego, że wydaje się, że nie jest już konserwowane (i są tam wyjątkowe błędy). MomentJS wydaje się jednak całkiem niezły.
TJ Crowder
@TJCrowder Użyłem date.js i działało do tego, do czego go potrzebowałem, ale masz rację, od jakiegoś czasu nie pracowano nad tym aktywnie. Sprawdzę momentjs. Dzięki!
rsbarro

Odpowiedzi:

203
var myDate = "26-02-2012";
myDate = myDate.split("-");
var newDate = myDate[1]+","+myDate[0]+","+myDate[2];
console.log(new Date(newDate).getTime());​

Aktualizacja:

var myDate = "26-02-2012";
myDate = myDate.split("-");
var newDate = myDate[1]+"/"+myDate[0]+"/"+myDate[2];
console.log(new Date(newDate).getTime());

DEMO (testowane w Chrome, FF, Opera, IE i Safari).

Alpha
źródło
Niestety, to nie działa w Safari5, ponieważ powraca NaN. W Safari musisz użyć innego możliwego konstruktora new Date(year, month, day);, w odniesieniu do tego przykładu:new Date(myDate[2], myDate[1], myDate[0]);
insertusernamehere
13
Zamiast konwertować ciąg daty z formatu „europejskiego” na „amerykański”, lepiej jest przekonwertować go na format ISO 8601 ( YYYY-MM-DD), który jest zrozumiały Date()i jest, ogólnie mówiąc, najbardziej interoperacyjnym formatem ciągów dat.
Walter Tross
3
Uwaga: new Date(newDate).getTime()wygeneruje znacznik czasu w rozdzielczości milisekund.
h7r
3
Na sekundę użyj: Math.floor(new Date(newDate).getTime() / 1000)
metamagikum
54

Wypróbuj tę funkcję, używa metody Date.parse () i nie wymaga żadnej niestandardowej logiki:

function toTimestamp(strDate){
   var datum = Date.parse(strDate);
   return datum/1000;
}
alert(toTimestamp('02/13/2009 23:31:30'));
Ketan Savaliya
źródło
25
var dtstr = "26-02-2012";
new Date(dtstr.split("-").reverse().join("-")).getTime();
Dioda
źródło
24

ten refaktoryzowany kod to zrobi

let toTimestamp = strDate => Date.parse(strDate)

działa to we wszystkich nowoczesnych przeglądarkach z wyjątkiem IE8-

Jalasem
źródło
10

Są tu dwa problemy. Po pierwsze, możesz wywołać getTime tylko dla wystąpienia daty. Musisz zawinąć nową datę w nawiasy lub przypisać ją do zmiennej.

Po drugie, musisz przekazać mu ciąg znaków w odpowiednim formacie.

Przykład pracy:

(new Date("2012-02-26")).getTime();
Alan Bogu
źródło
1
Nie ma potrzeby zawijania daty w nawiasach. Wymagany jest tylko odpowiedni format ciągu.
maswerdna
5

Wystarczy odwrócić cyfrę daty i zmienić za -pomocą ,:

 new Date(2012,01,26).getTime(); // 02 becomes 01 because getMonth() method returns the month (from 0 to 11)

W Twoim przypadku:

 var myDate="26-02-2012";
 myDate=myDate.split("-");
 new Date(parseInt(myDate[2], 10), parseInt(myDate[1], 10) - 1 , parseInt(myDate[0]), 10).getTime();

Lokalizacja PS UK nie ma tutaj znaczenia.

antonjs
źródło
Ten format daty jest również nieprawidłowy i nie będzie działał niezawodnie w różnych przeglądarkach i różnych lokalizacjach (na przykład nie działa w przeglądarce Chrome z ustawieniami regionalnymi dla Wielkiej Brytanii). Jeśli masz zamiar zaproponować format, zasugeruj taki, który faktycznie działa.
TJ Crowder
Mam przykład z developer.mozilla.org/en/JavaScript/Reference/Global_Objects/… . Po prostu zapomniałem odłożyć sznurek. Teraz działa.
antonjs
2
W porządku, przynajmniej teraz powyższy kod nie używa nieprawidłowego formatu daty - po prostu podaje nieprawidłową datę z dwóch różnych powodów. Powyżej zdefiniowałeś datę 2 marca 2014 r. (Masz błędną kolejność pól). A gdyby pola były we właściwej kolejności, zdefiniowałbyś datę 26 marca 2012 (wartości miesiąca zaczynają się od zera). Ale ponieważ OP ma ciąg, a nie serię liczb, nie jest to aż tak przydatne, nawet jeśli rozwiązałeś te problemy.
TJ Crowder
@TJ Crowder dzięki za sugestie. Naprawiłem kod, jak powiedziałeś, konwertując String na liczbę. Merci.
antonjs
2
Pierwszy przykład kodu jest nadal błędny , a używanie Numberna ciągach zaczynających się od a 0jest problematyczne w niektórych silnikach - użyj parseInti określ podstawę.
TJ Crowder
5
function getTimeStamp() {
       var now = new Date();
       return ((now.getMonth() + 1) + '/' + (now.getDate()) + '/' + now.getFullYear() + " " + now.getHours() + ':'
                     + ((now.getMinutes() < 10) ? ("0" + now.getMinutes()) : (now.getMinutes())) + ':' + ((now.getSeconds() < 10) ? ("0" + now
                     .getSeconds()) : (now.getSeconds())));
}
deepakssn
źródło
4

Aby przekonwertować datę (ISO) na znacznik czasu systemu Unix , otrzymałem znacznik czasu o 3 znaki dłuższy niż potrzeba, więc mój rok wynosił około 50 000 ...

Musiałem to podzielić przez 1000: new Date('2012-02-26').getTime() / 1000

orszaczky
źródło
3

Dla tych, którzy chcą mieć czytelny znacznik czasu w formacie, yyyymmddHHMMSS

> (new Date()).toISOString().replace(/[^\d]/g,'')              // "20190220044724404"
> (new Date()).toISOString().replace(/[^\d]/g,'').slice(0, -3) // "20190220044724"
> (new Date()).toISOString().replace(/[^\d]/g,'').slice(0, -9) // "20190220"

Przykład użycia: rozszerzenie pliku kopii zapasowej. /my/path/my.file.js.20190220

allenhwkim
źródło
3

O ile przyszedłeś tutaj w poszukiwaniu aktualnej sygnatury czasowej

  var date      = new Date();
  var timestamp = date.getTime();

TLDR:

new Date().getTime();
//console.log(new Date().getTime());
TimeTrax
źródło
2

Twój ciąg nie jest w formacie, który Datema obsługiwać obiekt . Będziesz musiał sam go przeanalizować, użyć biblioteki do analizowania dat, takiej jak MomentJS lub starszej (i nie jest obecnie obsługiwana, o ile wiem) DateJS , lub wmasować ją w odpowiedni format (np. 2012-02-29) Przed poproszeniem Dateo przeanalizowanie .

Dlaczego otrzymujesz NaN: Kiedy pytasz new Date(...)o obsłużenie nieprawidłowego ciągu, zwraca Dateobiekt, dla którego ustawiono nieprawidłową datę ( new Date("29-02-2012").toString()zwraca "Invalid date"). Wywołanie getTime()obiektu daty w tym stanie zwraca NaN.

TJ Crowder
źródło
@benvds: Super, dzięki. Chociaż uważam, że komentarz „Poza tym jest on nieniszczący dla DOM” jest nieco dziwny ... Spodziewam się, że mieli na myśli to, że nie zmieniaDate obiektu (co nie ma nic wspólnego z DOM).
TJ Crowder
2
/**
 * Date to timestamp
 * @param  string template
 * @param  string date
 * @return string
 * @example         datetotime("d-m-Y", "26-02-2012") return 1330207200000
 */
function datetotime(template, date){
    date = date.split( template[1] );
    template = template.split( template[1] );
    date = date[ template.indexOf('m') ]
        + "/" + date[ template.indexOf('d') ]
        + "/" + date[ template.indexOf('Y') ];

    return (new Date(date).getTime());
}
Evgeniy
źródło
0

Odpowiedzi udzielili inni programiści, ale na swój własny sposób możesz to zrobić w locie bez tworzenia żadnej funkcji zdefiniowanej przez użytkownika w następujący sposób:

var timestamp = Date.parse("26-02-2012".split('-').reverse().join('-'));
alert(timestamp); // returns 1330214400000
Frederick Eze
źródło