HH : MM : SS 문자열을 자바 스크립트에서만 초로 변환


98

비슷한 요구 사항이 있습니다. HH : MM : SS 형식의 시간을 초로 만 변환합니까?

그러나 자바 스크립트에서. 초를 다른 형식으로 변환하는 많은 예를 보았지만 HH : MM : SS를 초로 변환하지 않았습니다. 어떤 도움을 주시면 감사하겠습니다.


죄송합니다 .. 오타로 인해 죄송합니다. 네, 시간 HH있어 : MM : SS
스리랑카 레디

무엇 DD인은 HH:MM:DD?
Brian Driscoll 2012 년

2
PHP 질문과 동일한 알고리즘입니다.
scottheckel 2012 년

음 .. H (시간) == 3천6백초, M (분) == 60 초 ... .. 그래서
MilkyWayJoe

1
내가 생각하는 유일한 해결책은 문자열을 배열로 분할 한 다음 3600을 시간에 곱하고 60을 분에 곱하고 모두 초 부분을 더하는 것입니다. 이것이 가장 간단한 해결책입니까?
Sri Reddy 2012 년

답변:


194

이 시도:

var hms = '02:04:33';   // your input string
var a = hms.split(':'); // split it at the colons

// minutes are worth 60 seconds. Hours are worth 60 minutes.
var seconds = (+a[0]) * 60 * 60 + (+a[1]) * 60 + (+a[2]); 

console.log(seconds);

3
이것의 프로토 타입 버전이 있습니다! String.prototype.toSeconds = function () { if (!this) return null; var hms = this.split(':'); return (+hms[0]) * 60 * 60 + (+hms[1]) * 60 + (+hms[2] || 0); } 참고 : || 0끝 부분은이 코드의 모든 구현에 적합합니다. HH : MM의 (여전히 유효한) 시간 표시 문제를 방지합니다 (Chrome type = "time"입력은 초 = 0 일 때이 형식으로 출력 됨).
Fateh Khalsa

굉장 물건의 친구
에디

난 단지가 hh:mm없습니다 seconds내가 수정해야 할 무엇,이 경우 ..?
Mr world wide

1
이 줄을 변경 @AbdulWaheed : var seconds = (+a[0]) * 60 * 60 + (+a[1]) * 60 + (+a[2]); var seconds = (+a[0]) * 60 * 60 + (+a[1]) * 60;
Rova

4
"+"연산자를 사용하여 숫자 문자열을 숫자로 변환하는 것은 좋지 않습니다. 짧고 "영리한"것처럼 보이지만 혼란스럽고 깨끗한 코드가 아닙니다. 대신 parseInt (x, 10)를 사용하십시오. 그리고 한 줄을 피하십시오. 또한 정의되지 않은 입력으로 오류를 방지합니다. 예 : 문자열이 아니거나 ":"이 없거나 "HH : MM"만 있습니다. 등
Dominik

68

이 함수는 "HH : MM : SS"및 "MM : SS"또는 "SS"를 처리합니다.

function hmsToSecondsOnly(str) {
    var p = str.split(':'),
        s = 0, m = 1;

    while (p.length > 0) {
        s += m * parseInt(p.pop(), 10);
        m *= 60;
    }

    return s;
}

좋습니다. 시간이 지남에 대한 요구 사항이 어떤 형식이든 상관없이 유지하겠습니다. 감사!
Sri Reddy 2012 년

나를 위해 우수 답변까지
Rezwan Azfar Haleem

이 답변에 유용합니다
마이크 아론

'HH : MM'형식으로 만 사용하기 위해 함수에서 변경해야하는 것은 무엇입니까?
noyruto88

38

이것은 다음을 통해 매우 탄력적으로 수행 할 수 있습니다.

'01:02:03'.split(':').reduce((acc,time) => (60 * acc) + +time);

이는 시간, 분 및 초 내의 각 시간 단위가 작은 단위보다 60의 배수이기 때문입니다. 시간은시 분 및 초 구성 요소로 분할 된 다음 각 단위를 통과 할 때 더 높은 단위의 누적 값에 60을 곱하여 초로 줄입니다.

+time숫자로 시간을 주조하는 데 사용됩니다.

기본적으로 다음을 수행합니다. (60 * ((60 * HHHH) + MM)) + SS

초만 지나면 결과는 문자열이되므로 전체 결과를 int로 캐스트 할 수 있습니다.

+('03'.split(':').reduce((acc,time) => (60 * acc) + +time));

그게 사실은 굉장히 영리한 .. 문제는이 계산에 비해 얼마나 빨리이다
ThatBrianDude

4
예, 영리하지만 실질적인 이득없이 유지하기 어려운 코드를 생성하는 좋은 예입니다. 축소 된 경우 4 개의 문자가 허용 된 답변의 축소 된 버전과 비교됩니다. 많은 웹 페이지가 현재 1MB를 초과하므로 절약은 중요하지 않습니다.
RobG

5
이 대답은 이해로하지 않지만, 정상적으로 모두 처리 않습니다 HH:MM:SS뿐만 아니라 MM:SS허용 대답하지 않는 동안,.
ckeeney

1
이것은 초 부분 만 주어지면 유형 변환 버그가 있습니다. 이를 방지하려면 메모를 0으로 명시 적으로 초기화해야합니다. 작품 : '03'.split(':').reduce((acc,time) => (60 * acc) + +time, 0);반환하기 때문에 예기치 않은 문자열을 실패 :'03'.split(':').reduce((acc,time) => (60 * acc) + +time);
펠릭스 거츠에게

@FelixGertz 잘 발견되었습니다.이 경우 수정을하겠습니다.
Paul

13

hh:mm:ss한 줄에서 문자열을 초로 변환 합니다. 또한 허용 h:m:s형식과 mm:ss, m:s

'08:45:20'.split(':').reverse().reduce((prev, curr, i) => prev + curr*Math.pow(60, i), 0)

4
답변 설명해주십시오
B001 ᛦ

hh:mm:ss한 줄에서 문자열을 초로 변환 합니다. 또한 허용 h:m:s형식 mm:ss, m:s
폴 숨기기

좋은 대답입니다! 그러나 다음을 건너 뛸 수 있습니다 reverse(). '00 : 01 : 11'.split ( ':'). reduce ((val, entry, i) => val + entry * (3600 / Math.pow (60, i)), 0 ) === 71
CMR

@CMR, 흥미로운 aproach, 그러나 mm:ss그것의 경우 제대로 작동하지 않습니다.
Paul Hide

Math.pow은 매우 느리고 감소에 따라 다른 답변에서와 같이 피할 수
Alejadro Xalabarder

12

Date 객체 의 getTime 함수는 1970/01/01 이후의 밀리 초를 가져 오므로 다음과 같이 할 수 있습니다.

var time = '12:23:00';
var seconds = new Date('1970-01-01T' + time + 'Z').getTime() / 1000;

1
방금 깨달았지만 이것은 일광 절약 시간제에서는 작동하지 않습니다. 필요는 실제 날짜 사용
Yablargo

1
@Yablargo 감사합니다. 이전 버전은 현지 시간대와 잘 작동하지 않았기 때문에 iso 8601 utc datetime 형식을 사용하도록 편집했습니다.
boskop 2013

9

시험

time="12:12:12";
tt=time.split(":");
sec=tt[0]*3600+tt[1]*60+tt[2]*1;

5
아, 그 * 1 :이 문자열 연결을 할 수 없습니다 얻을 수있는 현명한 방법입니다
Dagg Nabbit

5

자바 스크립트의 정적 메서드 Date.UTC()는 트릭을 수행합니다.

alert(getSeconds('00:22:17'));

function getSeconds(time)
{
    var ts = time.split(':');
    return Date.UTC(1970, 0, 1, ts[0], ts[1], ts[2]) / 1000;
}

4

다음은 원래 승인 된 답변에 대해 좀 더 읽기 쉬운 형식입니다.

const getSeconds = (hms: string) : number => {
  const [hours, minutes, seconds] = hms.split(':');
  return (+hours) * 60 * 60 + (+minutes) * 60 + (+seconds);
};

2
new Date(moment('23:04:33', "HH:mm")).getTime()

출력 : 1499755980000 (밀리 초) (1499755980000/1000) (초)

참고 :이 출력은 1970-01-01 12 : 0 : 0에서 현재까지의 diff를 계산하며 moment.js를 구현해야합니다.


OP는 밀리 초가 아닌 초를
요구함

user7294900 안녕, 난 내 대답을 업데이트 할 것이다 의견을 남겨주 들으, 우리는 1000 나눌 필요가 표준시
ITsDEv

1

이 기능은 MM : SS에서도 작동합니다.

const convertTime = (hms) => {
        if (hms.length <3){
         return hms
        } else if (hms.length <6){
          const a = hms.split(':')
          return hms = (+a[0]) * 60 + (+a[1])
        } else {
          const a = hms.split(':')
          return hms = (+a[0]) * 60 * 60 + (+a[1]) * 60 + (+a[2])
        }
      }


1

Paul이 제공 한 솔루션에서 가져옴 https://stackoverflow.com/a/45292588/1191101 왔지만 이전 함수 표기법을 사용하므로 다른 js 엔진 (예 : java Rhino)에서도 사용할 수 있습니다.

function strToSeconds (stime)
{
   return +(stime.split(':').reduce(function (acc,time) { return +(60 * acc) + +time }));
}

또는 이것 만 더 읽을 수 있습니다.

function strToSeconds (stime)
{
  var tt = stime.split(':').reverse ();
  return ((tt.length >= 3) ? (+tt[2]): 0)*60*60 + 
         ((tt.length >= 2) ? (+tt[1]): 0)*60 + 
         ((tt.length >= 1) ? (+tt[0]): 0);
}

0

function parsehhmmsst(arg) {
	var result = 0, arr = arg.split(':')
	if (arr[0] < 12) {
		result = arr[0] * 3600 // hours
	}
	result += arr[1] * 60 // minutes
	result += parseInt(arr[2]) // seconds
	if (arg.indexOf('P') > -1) {  // 8:00 PM > 8:00 AM
		result += 43200
	}
	return result
}
$('body').append(parsehhmmsst('12:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('1:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('2:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('3:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('4:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('5:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('6:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('7:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('8:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('9:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('10:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('11:00:00 AM') + '<br>')
$('body').append(parsehhmmsst('12:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('1:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('2:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('3:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('4:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('5:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('6:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('7:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('8:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('9:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('10:00:00 PM') + '<br>')
$('body').append(parsehhmmsst('11:00:00 PM') + '<br>')
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


0

이를 동적으로 수행 할 수 있습니다. HH : mm : ss뿐만 아니라 mm : ss 또는 ss 만 발생하는 경우에도 마찬가지입니다.

var str = '12:99:07';
var times = str.split(":");
times.reverse();
var x = times.length, y = 0, z;
for (var i = 0; i < x; i++) {
    z = times[i] * Math.pow(60, i);
    y += z;
}
console.log(y);

0

이것이 가장 명확하고 이해하기 쉬운 솔루션입니다.

function convertDurationtoSeconds(duration){
    const [hours, minutes, seconds] = duration.split(':');
    return Number(hours) * 60 * 60 + Number(minutes) * 60 + Number(seconds);
};

const input = '01:30:45';
const output = convertDurationtoSeconds(input);
console.log(`${input} is ${output} in seconds`);

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.