Получить эпоху для определенной даты с помощью Javascript


Ответы:


188

Вы можете создать Dateобъект и вызвать getTimeего:

new Date(2010, 6, 26).getTime() / 1000

13
Аргументу месяца для конструктора даты недостает единообразия, и он фактически отсчитывается от нуля. Это означает, что 7 августа, поэтому вам нужно вычесть 1 :-)
Andy E

6
@Andy - это дурацкая идея компенсировать месяцы на -1, сохраняя при этом остальное, и это именно та вещь, которая может свести с ума космический шаттл, если там когда-нибудь будет использоваться JavaScript :)
Anurag

7
Наверное, лучше пойти: new Date ("2010-7-26"). GetTime () / 1000, чтобы не думать о смещениях.
Vincent McNabb

6
@Vincent: new Date("2010-7-26")не будет анализироваться в Internet Explorer. Конструктор Date полагается на метод Date.parse () при передаче строки, который зависит от реализации в 3-й редакции ECMA-262 и, как следствие, заведомо негибкий в IE.
Andy E

Можно было бы минимизировать возможные ошибки или недопонимания, указав часовой пояс. По крайней мере, фактические (Linux-) версии Firefox, Opera и Chrome поддерживают создание экземпляра даты JavaScript, например новой даты («1 января 1970 г. по Гринвичу + 00: 00, 00:01»); что также уменьшает путаницу относительно правильного формата месяца.
Майкл Бестек




1

В некоторых ответах не объясняются побочные эффекты вариаций часового пояса для объекта JavaScript Date. Так что вам следует подумать над этим ответом, если вас это беспокоит.

Метод 1: зависит от часового пояса машины

По умолчанию JavaScript возвращает дату с учетом часового пояса машины, поэтому getTime()результат зависит от компьютера. Вы можете проверить это поведение, запустив:

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

Это не проблема, если вам действительно нужно время с начала эпохи с учетом вашего часового пояса. Поэтому, если вы хотите узнать время с начала эпохи для текущей даты или даже для указанной даты на основе часового пояса компьютера , вы можете продолжить использовать этот метод.

// 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)

Метод 2: не зависит от часового пояса машины

Однако, если вы хотите получить доступ к вариациям в часовом поясе и получить время с начала эпохи для указанной даты в формате UTC (то есть независимо от часового пояса), вам необходимо использовать Date.UTCметод или сдвинуть дату с вашего часового пояса на 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

Итак, используя этот метод (или, как вариант, вычитая разницу), результат должен быть:

// 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)

ИМО, если вы не знаете, что делаете (см. Примечание выше), вам следует предпочесть метод 2 , поскольку он не зависит от машины.


Конец примечания

Хотя рекомендации в этом ответе, и поскольку Date.UTCне работает без указанной даты / времени, вы можете быть склонны использовать альтернативный подход и сделать что-то вроде этого:

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" (?)

Это не имеет никакого смысла и, вероятно, НЕПРАВИЛЬНО (вы меняете дату). Помните, что этого нельзя делать. Если вы хотите узнать время с начала Эпохи от текущей даты И ВРЕМЕНИ , вы, скорее всего, в порядке, используя Метод 1 .


1

Date.parse()анализирует строковое представление даты и возвращает количество миллисекунд, прошедших с момента 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

Узнайте больше на: Date.parse ()


0
Number(new Date(2010, 6, 26))

Работает так же, как и все выше. Если вам нужны секунды, не забудьте/ 1000

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.