假设我有一个字符串1hr 30m 4s
。我将如何使用Node.js将字符串解析为(显然)从执行之日算起的某个时间?
我已经查看了NPM软件包date-fns
和moment
,但它们似乎并不能满足我的需求。
我猜您可以进行RegExp吗?
答案 0 :(得分:2)
自从您提到Moment.js以来,我建议将其Durations与ISO 8601 time interval格式一起使用,即“ 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>
只要它由小时(“ hr”),分钟(“ m”)和秒(“ s”)组成,它就几乎可以与您扔给它的任何持续时间字符串一起使用。
答案 1 :(得分:0)
答案 2 :(得分:0)
您猜对了。供以后参考,如果您尝试自己解决问题并在遇到任何问题时minimal, complete and verifiable example进行发布,则可能会得到更好的答案。
对于所有参与人员而言,毕竟要进行堆栈溢出并提出问题要比谷歌搜索“ 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);
答案 3 :(得分:0)
您可以执行以下操作:
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);