시간의 분 부분을 십진수로 변환

Sep 15 2020

시간 계산기 앱을 만들고 있습니다. 시작 시간, 종료 시간 및 점심 시간이 걸립니다.

시작 및 종료 시간의 경우 4 자리 hh : mm 시간이 걸립니다. 예 : 10:20.

시간을 십진수로 변환하는 함수를 만들었으므로 10:20 = 10.33입니다. 기능은 작동하지만 조금 무거워 보이며 누군가 내가 어떻게 더 잘 만들 수 있는지에 대한 제안이 있는지 궁금합니다.

const minuteConverter = time => {
    let h = Number(time.split(':')[0]);
    let m = Math.round((1 / 60 * (Number(time.split(':')[1])) + Number.EPSILON) * 100) / 100;
    let mConverted = Number(m.toString().split('.')[1])
    return Number(`${h}.${mConverted}`)
};
console.log(minuteConverter('10:20'))

시간은 소수점 둘째 자리까지의 숫자로 출력되어야합니다. 예를 들면

  • '10 : 20 '>> 10.33
  • '9:45'>> 9.75
  • '15 : 33 '>> 15.55

답변

15 RoToRa Sep 15 2020 at 18:33
  • 값이 변경되지 않으면 const대신 사용 let하여 변수를 선언 하십시오 .

  • time.split(':')두 번 실행하고 있습니다.

  • 문자열을 숫자로 변환하는 짧은 방법은 단항 +입니다.

  • JavaScript에는 toFixed()숫자를 고정 된 자릿수로 포맷하는 방법이 있습니다.


function minuteConverter(time) {
   const [h, m] = time.split(':');
   const value = +h + +m / 60;
   return value.toFixed(2);
}
6 SᴀᴍOnᴇᴌᴀ Sep 15 2020 at 18:28

더 간단한 기술

6 년 전 스택 오버플 로 에서이 동일한 질문에 대한 답변에 따라 분 변환 공식이 그렇게 복잡 할 필요는 없습니다. 많은 답변이 parseInt()문자열에서 숫자를 구문 분석 하는 데 사용 되지만 더 빠른 작업과 더 간단한 구문을 위해 대신 단항 더하기 연산자를 + 사용할 수 있습니다 ( 더 많은 컨텍스트 를 위해 parseInt 대 단항 더하기, 언제 사용할지? 참조).

분은 60으로 나눌 수 있으며 Number. 이 메서드 Number.toFixed()는 부동 소수점 수를 지정된 자릿수로 제한하는 데 사용할 수 있습니다.

ES-6 변수 선언

ES6 키워드가 좋아하기 때문에 let사용하는 배열 destructuring는 값을 할당 할 수 있습니다 h및 m받는 추가 호출 방지 한 표현의 split()방법을. 이것은 const우발적 인 재 할당을 방지하는 데 도움이되는 좋은 습관입니다.

화살표 기능 블록 뒤에 추가 종료 자

여러 줄 화살표 함수 표현식 은 본문 뒤에 세미콜론이 필요하지 않지만, 특히 자동 세미콜론 삽입 규칙에 익숙하지 않은 경우 끝에 세미콜론이 있어도 문제가되지 않습니다 .

단순화 된 코드

단순화 할 수있는 한 가지 방법이 있습니다.

const minuteConverter = time => {
    const [h, m] = time.split(':');
    return (+h + (+m/60)).toFixed(2);
};
['9:45', '10:03', '10:20', '15:33'].forEach(
    time => console.log(time, ' >> ', minuteConverter(time))
)

4 santanaG Sep 15 2020 at 20:01

더 나은 것은 상대적입니다! 그 코드를 작성하는 많은 방법.

개인적으로 다른 답변이 강조한 것처럼 간결하고 정확한 코드를 선호하지만 (여기에 내 의견이 있습니다) :

const minuteConverter = time => [time.split(':')]
  .map(([hour, minute]) => +(+hour + +minute / 60).toFixed(2))[0]

플러스는 약간 바쁠 수 있으므로 여기에 더 설명적인 / 산술 밀도가있는 버전도 있습니다.

const minuteConverter = time => [time.split(':')]
  .map(([hh, mm]) => [+hh, mm / 60])
  .reduce((hundred, [hours, minutes]) => Math.round((hours + minutes) * hundred) / hundred, 100)
3 Moamen Sep 15 2020 at 18:57

ES6 +대신 사용하십시오 Number().

대신에 let또는 var이 변수의 값이 변경되지 않을 경우 const를 사용하십시오 .

분해 할당을 사용하여 배열에서 변수를 만듭니다 let [h,m] = time.split(/[.:]/).

시간 변수에 시간 이 추가 되는 경우에도 10:30또는 을 허용 합니다.10.30.300

const timeStringToFloatMm = time => {
  let [h,m] = time.split(/[.:]/);
        h = h || 0;
  return (+h + +m / 60).toFixed(2);
}