Разобрать время «1 час 30 минут 4 секунды» как время вперед в JavaScript - PullRequest
0 голосов
/ 09 января 2019

Допустим, у меня есть строка 1hr 30m 4s. Как бы я использовал Node.js для разбора этой строки в (очевидно) время в будущем с даты, когда она была выполнена?

Я посмотрел на пакеты NPM date-fns и moment, но, похоже, они не соответствуют тому, что я ищу.

Я думаю, вы могли бы сделать RegExp?

Ответы [ 4 ]

0 голосов
/ 09 января 2019

Вы можете сделать что-то вроде:

var d="1hr 30m 4s"
var ds =d.split(/hr |m |s/)
var dnow=new Date()
var dlater= new Date()
dlater.setTime( dnow.getTime() + ( ds[2]*1 + ds[1]*60 + ds[0]* 3600) * 1000)

console.log("now",dnow);
console.log("later",dlater);
0 голосов
/ 09 января 2019

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

Приступить к переполнению стека и задать вопрос - это больше, чем поиск «javascript regex», в конце концов, для всех участников.

var date = new Date();
var s = '1hr 30m 4s';
var re = /((\d+)hr)?( (\d+)m)?( (\d+)s)?/m;
var match = re.exec(s);
if (match != null) {
    if (typeof(match[2]) !== 'undefined') {
        date.setHours( date.getHours() + parseInt(match[2]) );
    }
    if (typeof(match[4]) !== 'undefined') {
        date.setMinutes( date.getMinutes() + parseInt(match[4]) );
    }
    if (typeof(match[6]) !== 'undefined') {
        date.setSeconds( date.getSeconds() + parseInt(match[6]) );
    }
}
console.log(date);
0 голосов
/ 09 января 2019

Поскольку вы упомянули Moment.js, я бы порекомендовал использовать их Durations с интервалом времени ISO 8601 , т. Е. "PT1H30M4S".

Этот формат может быть проанализирован не только Moment.js, но и многими другими языками и библиотеками (ура для стандартов).

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

Например

const durationString = '1hr 30m 4s'

const iso8601TimeInterval = 'PT' + durationString
    .replace(/hr/ig, 'h') // replace "hr" with "h"
    .replace(/\s/g, '')   // remove the spaces
    .toUpperCase()        // uppercase
console.log('Time interval:', iso8601TimeInterval)

const duration = moment.duration(iso8601TimeInterval)
const now = moment()

console.info('Now:', now.format())
console.info('Then:', now.add(duration).format())
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.23.0/moment.min.js"></script>

Это должно работать практически с любой строкой длительности, которую вы ей набрасываете, если только она состоит из часов ("ч"), минут ("м") и секунд ("с").

0 голосов
/ 09 января 2019

Это довольно просто. Я считал, что по крайней мере секунды должны быть доступны. Вы должны извлечь 2-ую, 4-ую и 6-ую группу для часов, минут и секунд соответственно.

((\d{1,2})hr)?.((\d{1,2})m)?.((\d{1,2})s)

enter image description here

...