我试图编写一个函数,该函数接收一个形式的字符串' X:XX PM'并将其更改为没有AM或PM的24小时时间字符串。
这意味着:
' 12:00 AM'成为' 00'
'凌晨3点30分'成为' 03:30'
'下午4:00'成为' 16:00'
' 12:30 PM'成为' 12:30'
等等。
我使用Javascript的substr()函数,似乎工作不一致。这是代码:
function unFormatTime( timeString ) {
console.log( "length: " + timeString.length );
console.log( "string passed in: " + timeString );
var hour = 0;
var minute = '';
var amOrPm = '';
if ( length == 7 ) {
hour = parseInt( timeString.substr( 0, 1 ) );
minute = timeString.substr( 2, 2 );
amOrPm = timeString.substr( 5, 2 );
} else {
hour = parseInt( timeString.substr( 0, 2 ) );
minute = timeString.substr( 3, 2 );
amOrPm = timeString.substr( 6, 2 );
}
for ( var i = 0; i < timeString.length; i++ ) {
console.log( i + ", 1 " + "'" + timeString.substr( i, 1 ) + "'" );
console.log( i + ", 2 " + "'" + timeString.substr( i, 2 ) + "'" );
}
console.log( "unparsed: " + hour + " " + "'" + minute + "'" + " " + "'" + amOrPm + "'" );
if ( amOrPm == "PM" ) {
if ( hour != 12 ) {
hour += 12;
}
} else {
if ( hour == 12 ) {
hour -= 12;
}
}
if ( hour < 10 ) {
hour = '0' + hour;
}
console.log( "parsed: " + hour + " " + minute + " " + "'" + amOrPm + "'" );
var newString = hour + ':' + minute;
console.log( newString );
return newString;
}
那个循环就在那里,因为substr很不稳定。当函数给出&#39; 00 AM&#39;时,循环将打印
0, 1 '4'
2, 2 '00'
5, 2 'AM'
当字符串的长度为7时,这些是分配给hour,minute和amOrPm的匹配子字符串。当我打印这些实际变量时,我得到:
unparsed: 4 '0 ' 'M'
因此,分钟和amOrPm值无法正确设置。我确定我在某个地方只有一个拼写错误,但现在它似乎是Javascript中的某种错误而且它让我发疯了。
答案 0 :(得分:1)
我注意到的第一件事是
if ( length == 7 )
应该是
if ( timeString.length == 7 )
当我进行更改并以4:00 AM
作为参数执行函数时,我得到以下内容:
unparsed: 4 '00' 'AM'
parsed: 04 00 'AM'
04:00
似乎合法吗?虽然我建议使用正则表达式来完成这类任务。
答案 1 :(得分:1)
我还没有使用substr方法来解决这个问题。如果你想解决这个无外部库,那么我采用的vanilla方法是根据&#34;:&#34;来分割字符串。和#34; &#34 ;.这是coffeescript,但你明白了这个想法:
times = [
'12:00 AM'
'3:30 AM'
'4:00 PM'
'12:30 PM'
]
converted = []
isPm = (s)-> s?.toLowerCase() is 'pm'
for t in times
[hr, min] = t.split ':'
[min, amPm] = min.split ' '
if hr is '12' and !isPm(amPm)
hr = '00'
else if hr isnt '12' and isPm(amPm)
hr = parseInt(hr) + 12
if hr.toString().length < 2
hr = "0" + hr
converted.push "#{hr}:#{min}"
console.log converted # ["00:00", "03:30", "16:00", "12:30"]
我确定有一种正则表达方式,我只是没有深入研究,因为我通常使用像moment.js这样的外部库来进行日期计算和日期字符串解析。 / p>
答案 2 :(得分:0)
另一种做事方式可能是(显然这种方法没有处理边缘情况,也没有进行验证):
function parse(input){
if (!input) return "";
var isPM = /pm/i.test(input); // check if pm is in the string
var time = input.replace(/(a|p)m/ig, ''); // remove am/pm
time = input.replace(' ', ''); // remove spaces
var timeParts = time.split(':');
var hour = parseInt(timeParts[0], 10);
var minute = parseInt(timeParts[1], 10);
if(isPM) { hour+=12; }
else if (hour === 12){hour = 0}
// transform single digit numbers to double digits: 2 to 02
return ('00' + hour).slice(-2) + ':' + ('00' + minute).slice(-2);
}
我觉得你的解决方案有点难以理解。