Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将字符串转换为ISO 8601持续时间格式_Javascript_Momentjs_Iso - Fatal编程技术网

Javascript 将字符串转换为ISO 8601持续时间格式

Javascript 将字符串转换为ISO 8601持续时间格式,javascript,momentjs,iso,Javascript,Momentjs,Iso,我需要允许用户键入如下字符串: P1M3W4DT22H6M3S 1m 3w 4d 22h 6m 3s …然后将其转换为ISO 8601 duration格式,如下所示: P1M3W4DT22H6M3S 他们甚至应该被允许写更短的符号,比如: 10天12小时 我甚至不知道从哪里开始,似乎也找不到任何有助于这些转换的库。我可以使用矩从ISO 8601 duration格式转换,但不能转换为 建议 我试图删除空格,但我当然错过了时间之前的T: `P${duration.toUpperCase().

我需要允许用户键入如下字符串:

P1M3W4DT22H6M3S
1m 3w 4d 22h 6m 3s

…然后将其转换为ISO 8601 duration格式,如下所示:

P1M3W4DT22H6M3S
他们甚至应该被允许写更短的符号,比如:

10天12小时

我甚至不知道从哪里开始,似乎也找不到任何有助于这些转换的库。我可以使用矩从ISO 8601 duration格式转换,但不能转换为

建议

我试图删除空格,但我当然错过了时间之前的
T

`P${duration.toUpperCase().replace(/\s/g,,)}`

如果在
D
标记后缺少的是
T
分隔符,只需添加
.replace('D','DT')}

let持续时间='1m 3w 4d 22h 6m 3s'
`P${duration.toUpperCase().replace(/\s/g',).replace('D','DT')}`
//给出“P1M3W4D22H6M3S”
但这只适用于静态输入格式


对于解析完整和不完整的输入,您需要按类型解析它们

const parseDuration=duration=>{
常量键=['Y'、'M'、'W'、'D'、'H'、'MIN'、'S']
如果(!duration | | typeof duration!=“string”)
抛出“空输入”
让已解析={}
//按空间分割条目并对其进行处理
duration.split(/\s+/).map(r=>{
//获取每个条目的长度(编号)和类型
让[\u,len,type]=r.match(/^(\d+)(\w+)$/)
type=type.toUpperCase()类型
//如果设置了W、D或H,则假定M表示分钟
if(type=='M'&&(已解析['W']| |已解析['D']| |已解析['H']))
类型='MIN'
//A按类型指定长度
if(len和key.includes(type))
已解析[类型]=len
})
if(!Object.keys(已解析).length)
抛出新错误(“空输入”)
//将所有未定义的类型设置为零
用于(密钥常数k)
已解析[k]=parseInt(已解析[k])|| 0
//ISO 8601格式的持续时间
返回`P${parsed.Y}Y${parsed.M}M${parsed.W}W${parsed.D}DT${parsed.H}H${parsed.MIN}M${parsed.S}S`
}
试一试{
控制台日志(解析持续时间('1m 3w 4d 22h 6m 3s'))
}抓住{
console.warn('分析失败')
}
//P0Y1M3W4DT22H6M3S
试一试{
日志(解析持续时间('3w 12h 10m'))
}抓住{
console.warn('分析失败')
}
//P0Y0M3W0DT12H10M0S
试一试{
log(parseDuration('1bullshit'))
}抓住{
console.warn('分析失败')
}
//失败
试一试{
console.log(解析持续时间(“”))
}抓住{
console.warn('分析失败')
}

//失败
删除空格并大写字母后,可以使用正则表达式捕获输入的时间部分(如果有)。这将确定“T”分隔符的插入点:

const toDuration=s=>“P”+s.toUpperCase。替换(/\s/g,”)
.替换(/\d+H?\d*M?\d*S?$/,“T$&”);
控制台日志(持续时间(“1m 3w 4d 22h 6m 3s”);
控制台日志(持续时间(“10d 12h”);
控制台日志(toDuration(“10m”);
控制台日志(toDuration(“1y 8w 3d”);

控制台日志(持续时间(“2米12小时”)看起来太复杂了,但您尝试了什么?您不能为用户提供日期-时间选择器吗?我简要介绍的是允许使用这种类型的字符串。我试着坚持下去,但不确定这是否可行。如果输入是“10m”呢?那是10分钟还是10个月?其次,输入中各部分的顺序是否保证从大单位到小单位?@trincot-我不得不说分钟优先。但D不是必需的。你可以有一个像
3w 12h 10m
这样的字符串。我明白了,然后你需要逐个解析这些值。。。不应该很复杂,给我一点时间这是黄金,但除非你算上一些输入验证。例如,
toDuration(“”)
给你
P
toDuration('bullshit')
给你
PBULLSHIT
:-)当然,这假设输入的格式与原始帖子中的格式相同。我可能可以将其验证为带有矩的日期。添加了一个版本,该版本将在输入不具有预期格式时返回空字符串。