Преобразование даты UTC в местный часовой пояс

#javascript #momentjs

#javascript #momentjs

Вопрос:

У меня есть дата в формате UTC.

 "2016-10-12 05:03:51"
  

Я создал функцию для преобразования даты UTC в мое местное время.

 function FormatDate(date)
{   
    var arr = date.split(/[- :T]/), // from your example var date = "2012-11-14T06:57:36 0000";
    date = new Date(arr[0], arr[1]-1, arr[2], arr[3], arr[4], 00);

    var newDate = new Date(date.getTime() date.getTimezoneOffset()*60*1000);

    var offset = date.getTimezoneOffset() / 60;

    var hours = date.getHours();

    newDate.setHours(hours - offset);

    return newDate;
}
  

Мой местный часовой пояс — GMT 0530.

Мой код выдал этот результат:

 Tue Oct 11 2016 10:33:00 GMT 0530 (IST)
  

Я преобразовал дату с помощью онлайн-инструмента, чтобы получить правильные дату и время.

 Wednesday, October 12, 2016 10:30 AM
  

Мой код соответствует онлайн-инструменту по времени, но не по дате.

Как я могу исправить вывод моего кода, предпочтительно используя moment.js ?

Ответ №1:

UTC — это стандарт, а не формат. Я предполагаю, что вы имеете в виду, что ваши строки используют нулевое смещение, т.Е. «2016-10-12 05:03:51» равно «2016-10-12 05:03:51 0000»

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

 function parseDateUTC(s){   
  var arr = s.split(/D/);
  return new Date(Date.UTC(arr[0], arr[1]-1, arr[2], arr[3], arr[4], arr[5]));
}

console.log(parseDateUTC('2016-10-12 05:03:51').toLocaleString());  

Если вы хотите использовать moment.js , вы можете сделать что-то вроде следующего. Это заставляет moment использовать UTC при разборе строки, а затем локально записывать ее в output:

 var d = moment.utc('2016-10-12 05:03:51','YYYY-MM-DD HH:mm:ss');
console.log(d.local().format());  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.10.0/moment.js"></script>  

Ответ №2:

Поскольку вы отметили moment , я предполагаю, что вы используете moment .

В таких случаях вы должны придерживаться своего подхода и не смешивать объект moment и date.

 var dateStr = '2016-10-12 05:03:51';
var timeZone = " 0530";
var date = moment.utc(dateStr).utcOffset(dateStr   timeZone)
console.log(date.toString())  

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

1. Возвращает ошибку для меня. Кроме того, вы всегда должны сообщать синтаксическому анализатору формат, который вы ему предоставляете, в противном случае вы полагаетесь на его правильное угадывание.