使用此代码获取ymd:
var ymd = '20190716';
var year = ymd.substring(0, 4);
var month = ymd.substring(4, 2);
var day = ymd.substring(6, 2);
console.log(year);
console.log(month);
console.log(day);
我认为从索引到长度获取子字符串的正确方法。所以...
想要:
2019
07
16
但是得到了:
2019
19
1907
为什么?
答案 0 :(得分:5)
检查docs:
substring()方法返回字符串的开始索引和结束索引之间或字符串末尾的部分。
和
如果indexStart大于indexEnd,则substring()的效果就像两个参数被交换一样。
因此,当您传递4, 2
或6, 2
时,是说您希望结束索引在开始索引之前 ,因此参数被切换,并且您得到索引2到4,索引2到6。
也许您想要substr
,它可以满足您的期望:
substring()的参数代表开始和结束索引,而substr()的参数代表开始的索引和要包含在返回的字符串中的字符数。
var ymd = '20190716';
var year = ymd.substr(0, 4);
var month = ymd.substr(4, 2);
var day = ymd.substr(6, 2);
console.log(year);
console.log(month);
console.log(day);
但是(有点)过时了。我希望使用substring
或slice
并传递标记。
如果indexStart大于indexEnd,则substring()方法交换其两个参数,这意味着仍返回字符串。如果是这种情况,slice()方法将返回一个空字符串。
slice
的行为是更直观的IMO。
答案 1 :(得分:3)
substring()
的第二个参数不是您想要获取的子字符串的长度,而是结束索引。
所以substring(4,2)
从索引4开始,到索引2结束。给您“ 19”
答案 2 :(得分:1)
您还可以使用JavaScript正则表达式:
const date = "20190716";
const pattern = /(\d{4})(\d{2})(\d{2})/;
[result, year, month, day] = date.match(pattern);
console.log(year, month, day);
第一捕获组(\ d {4})
\d{4}
匹配一个数字(等于[0-9]){4}
量词-精确匹配4次第二个捕获组(\ d {2})
\d{2}
匹配一个数字(等于[0-9])
{2}
量词-精确匹配2次
第三捕获组(\ d {2})
\d{2}
匹配一个数字(等于[0-9])
{2}
量词-精确匹配2次