我正试图编写一个函数,该函数采用形式为"X:XX PM"的字符串,并将其更改为不带AM或PM的24HR时间字符串。
这意味着:
"12:00 AM"变为"00: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不稳定。当函数被指定为"4:00 AM"时,循环将打印
0, 1 '4'
2, 2 '00'
5, 2 'AM'
当字符串的长度为7时,这些是分配给小时、分钟和amOrPm的匹配子字符串。然而,当我打印这些实际变量时,我得到:
unparsed: 4 '0 ' 'M'
因此,分钟和amOrPm值在某种程度上设置不正确。我确信我只是在某个地方有一个拼写错误,但现在它似乎是Javascript中的某种错误,它让我抓狂。
我首先注意到的是
if ( length == 7 )
应该是
if ( timeString.length == 7 )
当我进行更改并以4:00 AM
为参数执行函数时,我得到以下内容:
unparsed: 4 '00' 'AM'
parsed: 04 00 'AM'
04:00
看起来合法吗?尽管我建议在这类任务中使用正则表达式。
我不会用substr方法来处理这个问题。如果你想解决这个没有外部库的问题,那么我会采用普通的方法,根据":"one_answers"来分割字符串。这是咖啡脚本,但你会想到:
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"]
我相信有一种regexp方法可以做到这一点,我只是没有深入研究,因为我通常使用moment.js这样的外部库来进行日期计算和日期字符串解析。
另一种方法可能是(显然,这会导致边缘案例未处理,验证未完成):
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);
}
我觉得你的解决方案有点难以理解。