将时间“1hr 30m 4s”解析为 JavaScript 中的提前时间
Parse time '1hr 30m 4s' as time ahead in JavaScript
假设我有一个字符串 1hr 30m 4s
。我如何使用 Node.js 将该字符串解析为(显然)从它执行之日起的未来时间?
我查看了 NPM 软件包 date-fns
和 moment
,但它们似乎无法满足我的需求。
我猜你可以做一个正则表达式?
很简单。我考虑过至少应该有几秒钟的时间。您需要分别提取出第 2、4 和 6 组的小时、分钟和秒。
((\d{1,2})hr)?.((\d{1,2})m)?.((\d{1,2})s)
你猜对了。为了将来参考,如果您尝试自己解决问题并 post minimal, complete and verifiable example 您遇到的任何问题,您可能会得到更好的答案。
来到 Stack Overflow 并提出问题比谷歌搜索更有效 '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);
既然你提到了Moment.js,我建议使用他们的Durations with an 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").
您可以按照以下方式做一些事情:
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);
假设我有一个字符串 1hr 30m 4s
。我如何使用 Node.js 将该字符串解析为(显然)从它执行之日起的未来时间?
我查看了 NPM 软件包 date-fns
和 moment
,但它们似乎无法满足我的需求。
我猜你可以做一个正则表达式?
很简单。我考虑过至少应该有几秒钟的时间。您需要分别提取出第 2、4 和 6 组的小时、分钟和秒。
((\d{1,2})hr)?.((\d{1,2})m)?.((\d{1,2})s)
你猜对了。为了将来参考,如果您尝试自己解决问题并 post minimal, complete and verifiable example 您遇到的任何问题,您可能会得到更好的答案。
来到 Stack Overflow 并提出问题比谷歌搜索更有效 '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);
既然你提到了Moment.js,我建议使用他们的Durations with an 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").
您可以按照以下方式做一些事情:
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);