Uzyskaj epokę dla określonej daty za pomocą JavaScript

Odpowiedzi:

188

Możesz stworzyć Dateobiekt i przywołać getTimego:

new Date(2010, 6, 26).getTime() / 1000
Michał Mrozek
źródło
13
Argument miesiąca dla konstruktora daty jest mało spójny i w rzeczywistości jest liczony od zera. Oznacza to, że 7 to sierpień, więc musisz odjąć 1 :-)
Andy E
6
@Andy - to dziwaczny pomysł, aby przesunąć miesiące o -1, zachowując resztę, i jest to dokładnie taki rodzaj rzeczy, która może doprowadzić do szaleństwa promu kosmicznego, gdyby kiedykolwiek został tam użyty JavaScript :)
Anurag
7
Prawdopodobnie lepiej będzie: nowa data („2010-7-26”). GetTime () / 1000, więc nie musisz myśleć o offsetach.
Vincent McNabb
6
@Vincent: new Date("2010-7-26")nie będzie analizować w przeglądarce Internet Explorer. Konstruktor Date opiera się na metodzie Date.parse () , gdy przekazywany jest ciąg znaków, co jest zależne od implementacji w 3.edycji ECMA-262 iw rezultacie notorycznie nieelastyczne w IE.
Andy E
Można by również zminimalizować ewentualne błędy lub nieporozumienia określające strefę czasową. Przynajmniej rzeczywiste (Linux-) wersje obsługi przeglądarek Firefox, Opera i Chrome do tworzenia instancji daty JavaScript, takiej jak nowa data („1 stycznia 1970 GMT + 00: 00, 00:01”); co również zmniejsza nieporozumienia dotyczące prawidłowego formatu miesiąca.
Michael Besteck
39
new Date("2016-3-17").valueOf() 

powróci długa epoka

Jyo Banerjee
źródło
2

Możesz także użyć funkcji Date.now ().

Neha M
źródło
1

Niektóre odpowiedzi nie wyjaśniają skutków ubocznych różnic w strefie czasowej dla obiektu Date JavaScript. Więc powinieneś rozważyć tę odpowiedź, jeśli jest to dla ciebie problemem.

Metoda 1: Zależna od strefy czasowej komputera

Domyślnie JavaScript zwraca datę z uwzględnieniem strefy czasowej komputera, więc getTime()wynik różni się w zależności od komputera. Możesz sprawdzić to zachowanie, uruchamiając:

new Date(1970, 0, 1, 0, 0, 0, 0).getTime()
    // Since 1970-01-01 is Epoch, you may expect ZERO
    // but in fact the result varies based on computer's timezone

Nie stanowi to problemu, jeśli naprawdę chcesz określić czas od Epoki, biorąc pod uwagę twoją strefę czasową. Więc jeśli chcesz uzyskać czas od Epoki dla bieżącej Daty lub nawet określonej Daty w oparciu o strefę czasową komputera , możesz nadal korzystać z tej metody.

// Seconds since Epoch (Unix timestamp format)

new Date().getTime() / 1000             // local Date/Time since Epoch in seconds
new Date(2020, 11, 1).getTime() / 1000  // time since Epoch to 2020-12-01 00:00 (local timezone) in seconds

// Milliseconds since Epoch (used by some systems, eg. JavaScript itself)

new Date().getTime()                    // local Date/Time since Epoch in milliseconds
new Date(2020,  0, 2).getTime()         // time since Epoch to 2020-01-02 00:00 (local timezone) in milliseconds

// **Warning**: notice that MONTHS in JavaScript Dates starts in zero (0 = January, 11 = December)

Metoda 2: niezależna od strefy czasowej komputera

Jeśli jednak chcesz uzyskać dostęp do zmian w strefie czasowej i uzyskać czas od Epoki dla określonej Daty w UTC (czyli niezależnie od strefy czasowej), musisz użyć Date.UTCmetody lub przesunąć datę ze swojej strefy czasowej na UTC:

Date.UTC(1970,  0, 1)
    // should be ZERO in any computer, since it is ZERO the difference from Epoch

    // Alternatively (if, for some reason, you do not want Date.UTC)
    const timezone_diff = new Date(1970, 0, 1).getTime()  // difference in milliseconds between your timezone and UTC
    (new Date(1970,  0, 1).getTime() - timezone_diff)
    // should be ZERO in any computer, since it is ZERO the difference from Epoch

Tak więc, używając tej metody (lub alternatywnie, odejmując różnicę), wynik powinien być:

// Seconds since Epoch (Unix timestamp format)

Date.UTC(2020,  0, 1) / 1000  // time since Epoch to 2020-01-01 00:00 UTC in seconds

    // Alternatively (if, for some reason, you do not want Date.UTC)
    const timezone_diff = new Date(1970, 0, 1).getTime()
    (new Date(2020,  0, 1).getTime() - timezone_diff) / 1000  // time since Epoch to 2020-01-01 00:00 UTC in seconds
    (new Date(2020, 11, 1).getTime() - timezone_diff) / 1000  // time since Epoch to 2020-12-01 00:00 UTC in seconds

// Milliseconds since Epoch (used by some systems, eg. JavaScript itself)

Date.UTC(2020,  0, 2)   // time since Epoch to 2020-01-02 00:00 UTC in milliseconds

    // Alternatively (if, for some reason, you do not want Date.UTC)
    const timezone_diff = new Date(1970, 0, 1).getTime()
    (new Date(2020,  0, 2).getTime() - timezone_diff)         // time since Epoch to 2020-01-02 00:00 UTC in milliseconds

// **Warning**: notice that MONTHS in JavaScript Dates starts in zero (0 = January, 11 = December)

IMO, chyba że wiesz, co robisz (patrz uwaga powyżej), powinieneś preferować metodę 2 , ponieważ jest niezależna od komputera.


Uwaga końcowa

Chociaż zalecenia w tej odpowiedzi, a ponieważ Date.UTCnie działają bez określonej daty / godziny, możesz być skłonny do zastosowania alternatywnego podejścia i zrobienia czegoś takiego:

const timezone_diff = new Date(1970, 0, 1).getTime()
(new Date().getTime() - timezone_diff)  // <-- !!! new Date() without arguments
    // means "local Date/Time subtracted by timezone since Epoch" (?)

Nie ma to żadnego sensu i prawdopodobnie jest NIEPRAWIDŁOWE (modyfikujesz datę). Pamiętaj, aby tego nie robić. Jeśli chcesz uzyskać czas od epoki od bieżącej daty ORAZ CZASU , najprawdopodobniej jesteś w porządku, używając metody 1 .

Diego Queiroz
źródło
1

Date.parse()metoda analizuje ciąg reprezentujący datę i zwraca liczbę milisekund, które upłynęły od January 1, 1970, 00:00:00 UTC.

const unixTimeZero = Date.parse('01 Jan 1970 00:00:00 GMT');
const javaScriptRelease = Date.parse('04 Dec 1995 00:12:00 GMT');

console.log(unixTimeZero);
// expected output: 0

console.log(javaScriptRelease);
// expected output: 818035920000

Dowiedz się więcej na: Date.parse ()

Sourabh
źródło
0
Number(new Date(2010, 6, 26))

Działa tak samo, jak powyższe. Jeśli potrzebujesz sekund, nie zapomnij/ 1000

Andrii Los
źródło