2010-08-10 3 views
1

Я работаю над проектом, где пользователь должен предоставить временные оценки по конкретным задачам. Мне интересно, есть ли уже скрипт (например, date.js), который может принимать пользовательский ввод и анализировать его на количество секунд.Есть ли парсер javascript, например date.js для оценки времени?

Examples: 
"2 days" = 172800 
"2 hours" = 7200 
"1d 5h" = 104400 
"15 minutes" = 900 

date.js отлично подходит для поиска на определенную дату в будущем, но мне нужно общее количество секунд, а не конкретная дата конца.

Я сам это закодирую, если он еще не существует, просто нужно сэкономить некоторое время, если оно есть.

ответ

3

Вот библиотека с верхней части моей головы (жаль, что я не мог сопротивляться)

var stringToSeconds = (function() { 
    //Closure to define things that 
    //do not change per function call 

    var reg = /(\d+)\s*(\w+)/g; 
    var units = {}; 

    //Lets be verbose 
    units.seconds = 1; 
    units.minutes = units.seconds * 60; 
    units.hours = units.minutes * 60; 
    units.days = units.hours * 24; 
    units.weeks = units.days * 7; 
    units.months = units.weeks * 4; 
    units.years = units.months * 12; 

    //Match unit shorthand 
    var getUnit = function(unit) { 
    unit = unit.toLowerCase(); 
    for (var name in units) { 
     if (!units.hasOwnProperty(name)) continue; 

     if (unit == name.substr(0, unit.length)) return units[name]; 
    } 
    return 0; 
    }; 


    return function(str) { 
    var match, totalSeconds = 0; 

    while (match = reg.exec(str)) { 
     var num = match[1], unit = match[2]; 

     totalSeconds += getUnit(unit) * num; 
    } 

    return totalSeconds; 
    } 
}()); 

Попробуйте: http://jsbin.com/ozeda/2/edit

+0

Очень приятно :) Работает как шарм. – Pepper

+0

Довольно сложно конвертировать из нескольких секунд/минут/часов/дней/недель в несколько месяцев/лет, поскольку количество дней в месяц или в год является нерегулярным и меняется от месяца к месяцу и от года к году -год. – yfeldblum

+0

Я, я думаю о том, чтобы взять месяцы и годы из сценария, когда я его ввел. Не нужно в моем случае. – Pepper

0

Сделано изменения значений единиц, расчет в течение нескольких месяцев было годами.

units.seconds = 1; 
units.minutes = 60; 
units.hours = 3600; 
units.days = 86400; 
units.weeks = 604800; 
units.months = 262974383; 
units.years = 31556926; 
0

Вот моя последняя рабочая версия, основанная на отличном сценарии MooGoo. Ill обновить это после еще одного теста ошибок/браузера.

Пожалуйста, дайте мне знать, если у вас есть какие-либо улучшения :)

  • добавлена ​​поддержка десятичных знаков. 1,5 часа = 1 час 30 минут
  • добавлена ​​функция get_string. Перейдите в число секунд и получите форматированную строку.
  • сделал так, что число по умолчанию соответствует часам. 5 = 5 часов

Демо: http://jsbin.com/ihuco3/2/edit

var string2seconds = { 

    reg: /([\d]+[\.]?[\d{1,2}]?)\s*(\w+)/g, 

    units: function() 
    { 
    var units = {}; 
    units.seconds = 1; 
    units.minutes = 60; 
    units.hours = 3600; 
    units.days = 86400; 
    units.weeks = 604800; 
    units.months = 262974383; 
    units.years = 31556926; 
    return units; 
    }, 

    get_unit: function(unit) 
    { 
    var units = this.units(); 

    unit = unit.toLowerCase(); 

    for (var name in units) 
    { 
     if(!units.hasOwnProperty(name)) continue; 
     if(unit == name.substr(0, unit.length)) return units[name]; 
    } 

    return 0; 
    }, 

    get_string: function(seconds) 
    { 
    var years = Math.floor(seconds/31556926); 
    var days = Math.floor((seconds % 31556926)/86400); 
    var hours = Math.floor(((seconds % 31556926) % 86400)/3600); 
    var minutes = Math.floor((((seconds % 31556926) % 86400) % 3600)/60); 
    var string = ''; 

    if(years != 0) string = string + years + ' year'+this.s(years)+' '; 
    if(days != 0) string = string + days + ' day'+this.s(days)+ ' '; 
    if(hours != 0) string = string + hours + ' hour'+this.s(hours)+ ' '; 
    if(minutes != 0) string = string + minutes + ' minute'+this.s(minutes)+ ' '; 

    if(string == '') return false; 

    return string; 
    }, 

    get_seconds: function(str) 
    { 
    var match, totalSeconds = 0, num, unit; 

    if((str - 0) == str && str.length > 0) 
    { 
     str = str + 'hours'; 
    } 

    while (match = this.reg.exec(str)) 
    { 
     num = match[1]; 
     unit = match[2]; 
     totalSeconds += this.get_unit(unit) * num; 
    } 

    return totalSeconds; 
    }, 

    s: function(count) 
    { 
    if(count != 1) return 's'; 
    return ''; 
    } 

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