Javascript子字符串()不一致



我正试图编写一个函数,该函数采用形式为"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);
}

我觉得你的解决方案有点难以理解。

最新更新