Есть ли JS альтернатива Date.now (), которая не меняется в зависимости от часовых поясов? - PullRequest
0 голосов
/ 29 марта 2020

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

Есть ли альтернатива Date.now () или опция, которую я упустил, которая может стандартизировать это?

Редактировать: Это то, что мне нужно для даты:

function timeDB(){
    let unix_timestamp = Date.now();
    var date = new Date(unix_timestamp);
    var hours = date.getHours();
    var year =  date.getFullYear();
    var month =  date.getMonth()+1;
    var day = date.getDate();

if ( month <10){
    year = year*10;
}
if ( day <10){
    month = month*10;
}
if ( hours <10){
    day = day*10;
}
    var formattedTime = year + '' + month + '' + day + '' + hours;
    return formattedTime;
}

Это форматированное время будет затем использовать в качестве версии в моей БД, поэтому мне нужна универсальная временная метка.

Ответы [ 3 ]

1 голос
/ 29 марта 2020

Если ваша среда правильно сконфигурирована, чтобы знать ее часовой пояс (большинство браузеров), то все, что вам нужно сделать, это добавить смещение часового пояса к вашей временной метке:

Date.now() + new Date().getTimezoneOffset() * 60 * 1000
0 голосов
/ 30 марта 2020

Date.now возвращает смещение в миллисекундах с 1970-01-01 UT C, оно не зависит от часовых поясов или перехода на летнее время, однако на него влияет точность часов хост-системы.

Для «универсальной» временной отметки следует использовать значения универсального координированного времени (UT C). Вы можете создать свою собственную строку, используя getUT C* методы, такие как getUTCFullYear , getUTCMonth , et c. или просто используйте строку, возвращаемую toISOString и переформатируйте детали в соответствии с требованиями.

Если вы просто хотите YYYY MM DD HH, тогда вы можете использовать очень простую функцию, значения уже заполнены нулями, поэтому трюк * 10 не требуется:

function timeDB(date = new Date()) {
  return date.toISOString().split(/\D/).splice(0,4).join('');
}

console.log(timeDB());

На уже есть много вопросов и ответов о том, как отформатировать дату .

Однако, если вам просто нужно уникальное значение для управления версиями и только с использованием текущих дат, тогда достаточно использовать значение, возвращаемое Date.now . Это всего на 3 цифры дольше, и вы можете урезать его до 10 цифр, если вы будете sh:

String(Date.now()).slice(0,10);

Это эффективно дает вам метку времени в секундах с (довольно распространенной) эпохи 1970-01-01 и легко превращается в дату.

0 голосов
/ 29 марта 2020

Я думаю, вам нужна UT C версия даты и времени, поэтому ваш код должен быть

function timeDB(){
    let unix_timestamp = Date.now();
    var date = new Date(unix_timestamp);
    var hours = date.getUTCHours();
    var year =  date.getUTCFullYear();
    var month =  date.getUTCMonth()+1;
    var day = date.getUTCDate();

if ( month <10){
    year = year*10;
}
if ( day <10){
    month = month*10;
}
if ( hours <10){
    day = day*10;
}
    var formattedTime = year + '' + month + '' + day + '' + hours;
    return formattedTime;
}

Это вернет одинаковые значения независимо от того, из какой страны обслуживается.

...