Javascript substr()不一致

时间:2015-12-10 19:06:59

标签: javascript

我试图编写一个函数,该函数接收一个形式的字符串' 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中的某种错误而且它让我发疯了。

3 个答案:

答案 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);
}

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