Получить текущую метку времени из гггг-мм-дд чч: мм: сс, используя UTC / GMT + 0 в качестве эпохи - PullRequest
0 голосов
/ 13 ноября 2018

Я много пробовал в этом сообществе, но, похоже, для моего случая нет гиперспецифичного сценария.

Так что в основном у меня есть строка в формате yyyy-mm-dd. Я использую методы даты, чтобы настроить его и добавить время на дату, чтобы сделать его более конкретным. Я хочу преобразовать его в метку времени, игнорируя текущий часовой пояс клиентского компьютера (или используя часовой пояс UTC).

У меня есть этот код:

function getTimestampRange(sparams, eparams){

sparams = "2018-11-12", eparams = "2018-11-13"; //sample param values

const start = sparams.split("-");
const end = eparams.split("-");

const startDate = new Date(start[0], start[1] - 1, start[2]);
const endDate = new Date(end[0], end[1] - 1, end[2]);
endDate.setHours(23);
endDate.setMinutes(59);
endDate.setSeconds(59);

//startDate is 2018-11-12 00:00:00 and endDate is 2018-11-13 23:59:59

const startTS = startDate.getTime() / 1000;
const endTS = endDate.getTime() / 1000;

return [startTS, endTS]
}

Это все прекрасно, но проблема в том, что я получаю метку времени относительно часового пояса моего компьютера. (GMT + 9). Итак, моя эпоха - 9-й час 1970-01-01. Что не то, что мне нужно. Мне нужна метка времени по Гринвичу +0 UTC.

В этом сценарии я получу 1541948400 и 1542121199, start и end соответственно; где я должен был получить 1541980800 и 1542153599.

Tasukete Kudasai

1 Ответ

0 голосов
/ 13 ноября 2018

У вас есть два варианта здесь ...

  1. Используйте Date.UTC для построения меток времени в UTC

    const startDate = Date.UTC(start[0], start[1] - 1, start[2]) // a timestamp
    const endDate = Date.UTC(end[0], end[1] - 1, end[2], 23, 59, 59) // a timestamp
    

    Примечание : Date.UTC() создает метку времени в миллисекундах, а не экземпляр Date.Так как вы можете установить часы, минуты и секунды, как указано выше, вам больше не нужно манипулировать ими.

  2. Используйте ваши существующие строки даты, которые соответствуют ISO 8601стандарт в качестве единственного аргумента для конструктора Date.

    В этом * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 10 * * * * * * * * * 10 * *

    .отличается тем, что строки только с датой (например, «1970-01-01») обрабатываются как UTC, а не как локальные.

    const startDate = new Date(sparams)
    const endDate = new Date(eparams)
    

    Синтаксический анализ ISO 8601 предположительно поддерживается ввсе приличные браузеры и IE от v9.Поскольку это зависит от конкретной «функции» , которая может быть или не быть реализована в клиенте, существует элемент риска для этого метода.


Для вашей конечной даты, при разборе вы можете легко добавить часть времени и зоны к строке даты, а не манипулировать объектом даты значениями часа, минуты и секунды.Например,

const endDate = new Date(`${eparams}T23:59:59Z`)

альтернативно, используйте Date.prototype.setUTCHours() ...

const endDate = new Date(eparams)
endDate.setUTCHours(23, 59, 59)
...