2013-04-02 4 views
1

у меня есть текущее время WebService, который возвращает объект JSON, как такПреобразование «длинная форма» строка времени-даты в Javascript дата объекта

{ 
    "tz": "America\/Chicago", 
    "hour": 15, 
    "datetime": "Mon, 01 Apr 2013 15:46:58 -0500", 
    "second": 58, 
    "error": false, 
    "minute": 46 
} 

Есть простой whay преобразовать DATETIME строку долгосрочной формы

"datetime": "Mon, 01 Apr 2013 15:46:58 -0500" 

в объект Дата javascript? (Кроме использования регулярных выражений для разбора строки)

+0

Может быть, это помогает: http://stackoverflow.com/q/1647550/218196. –

+1

Формат определен в [RFC 3339] (http://www.ietf.org/rfc/rfc3339.txt). Он очень популярен среди старых интернет-протоколов. Единственное приятное в этом формате, что вам не нужно использовать регулярное выражение. Количество столбцов фиксировано («01»). – kay

ответ

0

Единственный безопасный способ синтаксического анализа строки даты - сделать это самостоятельно. ES5 определяет стандартную строку для Date.parse, которая основана на ISO8601, но она не поддерживается всеми используемыми браузерами, и ваша строка в любом случае не соответствует этому формату.

Другие строковые значения «работают» для ограниченного набора браузеров, но это не является надежной стратегией для веб-приложения.

Строки даты синтаксического анализа довольно просты: разделите биты, создайте объект даты из частей и при необходимости примените смещение. Так что, если ваша строка пн, 1 апреля 2013 15:46:58 -0500 вы можете использовать такую ​​функцию:

function parseDateString(s) { 
    var months = {jan:0,feb:1,mar:2,apr:3,may:4,jun:5, 
       jul:6,aug:7,sep:8,oct:9,nov:10,dec:11}; 
    s = s.split(/[\s:]/); 

    var d = new Date(s[3], months[s[2].toLowerCase()], s[1], s[4], s[5], s[6]); 
    var sign = s[7]<0? 1 : -1; 
    var l = s[7].length; 

    // offsetMinutes is minutes to add to time to get UTC 
    var offsetMinutes = sign * s[7].substring(l-2,l) + sign * s[7].substring(l-4,l-2) * 60; 

    // Add offset and subtract offset of current timezone 
    d.setMinutes(d.getMinutes() + offsetMinutes - d.getTimezoneOffset()); 

    return d; 
} 

var s = 'Mon, 01 Apr 2013 15:46:58 -0500' 
alert(s + '\n' + parseDateString(s)); // Mon, 01 Apr 2013 15:46:58 -0500 
             // Tue Apr 02 2013 06:46:58 GMT+1000 
2
var dt= "Mon, 01 Apr 2013 15:46:58 -050"; 
var date = new Date(dt); 
alert(date.getDay()); 
+0

Вероятно, не стоит полагаться на совпадение деталей, зависящих от реализации, когда методы, совместимые со стандартами, доступны для незначительных усилий. – RobG

+0

Хорошая точка и да, я согласен с тобой .... – PSL

+0

Это не зависит от реализации. [Спектр говорит] (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date), что Date ctor может получить дату DateString, совместимую с RFC2822. – kay

1
var dat = { 
    "tz": "America\/Chicago", 
    "hour": 15, 
    "datetime": "Mon, 01 Apr 2013 15:46:58 -0500", 
    "second": 58, 
    "error": false, 
    "minute": 46 
}; 

var dateObj = new Date(dat.datetime); 

Mozilla Developer Network может показать вам некоторые более полезную информацию. Конструктор Date будет анализировать строку для вас.

+0

-1: извините, ваш ответ хороший, за исключением ссылки w3schools. Вы должны использовать ссылки [MDN] (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date) (или es5.github.com). См. Http://w3fools.com/ – kay

+0

Это действительно информативно, спасибо. Это была первая ссылка, которую я видел в поиске Google, и информация о объектах Date показалась хорошей, но я не знал всего об W3schools. – ctlevi

0

Это может быть опущено, но вы можете рассмотреть возможность использования momentjs для обработки даты/времени. Неплохая библиотека для использования.

var myDate = moment(myObj.datetime); 

myDate - объект даты JavaScript.

+0

Это перебор. OP уже имеет дату в форме RFC 3339. – kay

0

/* Вы можете переписать datestrings, когда вам нужно их более общим Формат- получение месяца и часовой пояс является большой частью работы: */

function rewriteDate(str){ 
    var months= ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 
    'jul', 'aug', 'sep', 'oct', 'nov', 'dec'], 
    dA= str.toLowerCase().split(' '), 
    m= months.indexOf(dA[2].substring(0, 3)); 

    ++m; 
    if(m<10) m= '0'+m; 
    dA[2]= m; 

    var dmy= dA.slice(1, 4).reverse().join('-'); 

    var t= 'T'+dA[4], L= dA[5].length-2, 
    z= dA[5].substring(0, L)+':'+dA[5].substring(L); 
    return dmy+t+z; 
} 

var jsn={ 
    "datetime":"Mon, 01 Apr 2013 15:46:58 -0500" 
}; 
jsn["datetime"]= rewriteDate(jsn.datetime); 
//returns: (string) "2013-04-01T15:46:58-05:00" 


alert(new Date(jsn.datetime).toUTCString()); 

// returns: (Date) Mon, 01 Apr 2013 20:46:58 GMT 
Смежные вопросы