Преобразование метки времени mysql UTC_TIMESTAMP в CST и MST с использованием Javascript

#javascript #mysql #utc

#javascript #mysql #utc

Вопрос:

Я провел бесконечный поиск, но не могу найти решение, которое работает для меня. Я сохраняю записи в базе данных mysql, которая регистрирует время ее создания по UTC (UTC_TIMESTAMP()). Мне нужно представить данные пользователю (используя JavaScript) в его местное время. Я пробовал следующее, и это не работает:

JavaScript:

 function localizeDateStr(dateToConvert,divId){
    newDate = new Date(dateToConvert);
    document.getElementById(divId).innerHTML = newDate.toString();
}
  

HTML:

 <div id="<?php echo $divId ?>" class="td-short"></div>
<script type="text/javascript">window.onload = localizeDateStr('<?php echo $entryTime;?>','<?php echo $divId;?>');</script>
  

Дата UTC, которая хранится в базе данных, совпадает с отображаемой датой.Я не вижу преобразованную дату. Будем признательны за любую помощь. Пожалуйста, сообщите.

Комментарии:

1. Что точно находится в dateToConvert ? Пожалуйста, предоставьте пример ввода.

2. Примером может служить ‘2019-03-20 17:43:53’.

3. на экране отображается следующее: Ср. 20 марта 2019 г. 17:43:53 GMT-06.00 (горное дневное время)

Ответ №1:

Разбор строки через Date конструктор (или через Date.parse ) очень чувствителен к формату входной строки. Учитывая значение, которое вы указали в комментариях '2019-03-20 17:43:53' , большинство реализаций будут интерпретировать это в терминах местного времени. Однако, спецификация не требует соответствия этому, поскольку она описывает только очень конкретный формат. Все остальное зависит от реализации.

Предполагая, что ваши строки последовательно представлены в этом формате, и вы хотите, чтобы он интерпретировался как UTC, ваши варианты:

  • Настройте строку так, чтобы она включала T разделитель между частями даты и времени и заканчивалась на Z для обозначения UTC.

     var newDate = new Date(dateToConvert.replace(' ','T')   'Z');
      
  • Проанализируйте строку самостоятельно:

     var parts = dateToConvert.split(/[-: ]/g).map((x) => parseInt(x));
    parts[1]--; // Months are 0-11, so adjust
    var newDate = new Date(Date.UTC(...parts));
      
  • Используйте библиотеку, подобную Luxon:

     var dt = luxon.DateTime.fromFormat(dateToConvert,
                                       'yyyy-MM-dd HH:mm:ss', { zone: 'UTC' });
    var newDate = dt.toJSDate();
      

    или момент:

     var newDate = moment.utc(dateToConvert).toDate();
      

Комментарии:

1. Замечательно. Спасибо. Я выбрал var newDate = новая дата (dateToConvert.replace(‘ ‘,’T’) ‘Z’);. У вас есть предпочтения в отношении того, какое решение выбрать?

2. Если вы делаете что-то значительное, я бы порекомендовал библиотеку, подобную Luxon.