2015-10-16 3 views
1

Я получаю строчную отформатированную дату с часовым поясом UTC. Мне нужно преобразовать это время даты в текущий часовой пояс пользователя, используя или .Как я могу преобразовать даты в формате UTC, не имеющие смещения по местному времени в JavaScript?

Я получаю это:

9:43pm 16/10/2015 //this is UTC time, I am getting this via an ajax call 

Мне нужно, чтобы преобразовать его в этом:

12:00pm 16/10/2015 //whatever time by that location 
+0

Вы можете использовать moment.js? –

+0

в том, что отправлен фактический формат? Вы контролируете источник api? – charlietfl

+0

@charlietfl да это фактический формат времени, отправленный с php –

ответ

4

Если вы можете выбрать тот формат друг от друга, или получить стандартный формат JavaScript можно разобрать - вы можете преобразуйте его в объект Date. Я не вижу смещения на эту дату, что является проблематичным, когда JavaScript пытается его проанализировать. Если предположить, что все, что есть, мы можем заставить дату UTC со следующим ...

// ------- new Date(Date.UTC(year, month, day, hour, minute, second)) 
var date = new Date(Date.UTC(2015, 9, 16, 21, 43, 0)); 

console.log(date) // Fri Oct 16 2015 15:43:00 GMT-0600 (Mountain Daylight Time (Mexico)) 
  • отмечают, что month в Date.UTC равна нулю на основе, например, Октябрь будет 9

new Date(value) бы сделать это для нас автоматически, если формат правильно - где value фактическое значение даты вы получаете - но этот формат не будет разбирать, как есть. Если в этом формате нет способа, вы можете манипулировать им для работы в приведенном выше примере. Вот непроверенных алгоритм для примера ...

var formatted = '9:43pm 16/10/2015' 

function createDateUTC(formatted) { 

    var hourOffset = formatted.split(' ')[0].split(':')[1].match(/[a-zA-Z]+/g)[0] === 'pm' ? 12 : 0 

    var year = parseInt(formatted.split('/').pop()); 
    var month = parseInt(formatted.split('/')[1]) - 1; 
    var day = parseInt(formatted.split('/')[0].split(' ').pop()); 
    var hour = hourOffset + parseInt(formatted.split(' ')[0].split(':')[0]); 
    var minute = parseInt(formatted.split(' ')[0].split(':')[1]); 

    return new Date(Date.UTC(year, month, day, hour, minute, 0)); 
} 

var myDate = createDateUTC(formatted); 

JSFiddle Link - рабочая демо

Отъезд UTC() и Date Object документы для получения дополнительной информации


Кроме того, чтобы получить точный формат, который вы хотите, мы можем ввести еще несколько функций, которые предоставят нам 12:00pm 16/10/2015 формат

function formatAMPM(date) { 
    var hours = date.getHours(); 
    var minutes = date.getMinutes(); 
    var ampm = hours >= 12 ? 'pm' : 'am'; 
    hours = hours % 12; 
    hours = hours ? hours : 12; // the hour '0' should be '12' 
    minutes = minutes < 10 ? '0'+minutes : minutes; 
    var strTime = hours + ':' + minutes + '' + ampm; 
    return strTime; 
} 

function formatMMDDYYYY(inputFormat) { 
    function pad(s) { return (s < 10) ? '0' + s : s; } 
    var d = new Date(inputFormat); 
    return [pad(d.getDate()), pad(d.getMonth()+1), d.getFullYear()].join('/'); 
} 

console.log(formatAMPM(myDate) + ' ' + formatMMDDYYYY(myDate)); 
// Mountain Daylight Time => -- 3:43pm 16/10/2015 

JSFiddle Link - отформатирован пример

Я reccoment глядя в Moment.js, если вы планируете делать тяжелую форматирование даты и манипуляции.


В целом - лучшее решение для этого было бы вернуть приемлемый формат с сервера, разрешить его к местному времени изначально, например, new Date(), и используйте надежную библиотеку форматирования, а не свою собственную, чтобы отображать ее, как вы пожелаете.

+0

спасибо за решение, я немного запутался в одном. Фактически, я получаю дату в часовой пояс Южной Австралии, и мне нужно преобразовать ее в часовой пояс текущего местоположения пользователя. Здесь я не понял, где мы преобразуем часовой пояс в часовой пояс пользователя. –

+0

Хорошо, я думаю, что я не получил код, теперь я понимаю, где он конвертируется в мой часовой пояс, но там, где мы проходим, данное время датируется в Южной Австралии. Например, если я буду конвертировать Южную Австралию (11:30 17/10/2015) в UTC, тогда он вернется в другое время, и если я буду конвертировать время Азии/Калькутты (11:30 17/10/2015) в UTC, тогда это будет возвращать разное время. Поэтому я думаю, что нам также необходимо передать часовой пояс данного времени где-то. –

+0

эти оба кажутся одинаковыми. Не имеет значения это имя, мой пример говорит о Мексике, но я в США, но время правильное. Он управляется системными часами ОС. Наверное, я действительно смущен вашим ответом - почему именно это не работает для вас? – scniro

1

Вы должны обработать эту строку немного, чтобы извлечь год, месяц, день, час и минуту.

Затем вы можете создать локальную дату с этой даты UTC с помощью этого:

var time = new Date (Date.UTC('year', 'month', 'day', 'hour', 'minute')); 

В моем случае, «9:43 вечера 16/10/2015» возвращается: «Пн 16 ноября 2015 7:43: 00 GMT-0200 (Hora de verano de Argentina) '.

+0

как это отличается от ответа, который я написал ранее? – scniro

+0

Я не видел вашего ответа, я проверял результаты этого, и от наших ответов потребовалось больше времени. У вашего ответа есть недостаток, хотя, вы должны проверить, час ли pm или am, чтобы добавить 12 или нет. Удачи! –

+0

ah yea хороший звонок Я не поймал, что на час вещь – scniro

Смежные вопросы