JavaScrpt/시간 날짜 달력

JavaScript Date - parse()를 사용하여 경과된 년, 일, 시, 분, 초 구하기, 윤년(elapsed) 계산

carrotweb 2022. 3. 20. 23:22
728x90
반응형

JavaScript의 Date 객체에 있는 parse() 메서드를 시용하여 날짜와 시간 문자열을 구문 분석하여 1970년 1월 1일 00시 00분 00초 UTC를 기준으로 경과 한 밀리초를 구하고 경과된 년, 일, 시, 분, 초를 계산해 보겠습니다.

parse() 메서드

parse() 메서드는 날짜와 시간 문자열을 구문 분석하여 1970년 1월 1일 00시 00분 00초 UTC를 기준으로 경과 한 밀리초를 반환합니다.

Date.parse(dateString);

 

dateString(날짜와 시간)은 ISO 8601과 RFC 2822로 표기된 문자열입니다.

console.log(Date.parse("2022-03-13 15:23:37"));
console.log(Date.parse("2022-3-13 15:23:37"));
console.log(Date.parse("2022-03-13T15:23:37"));
console.log(Date.parse("2022/03/13 15:23:37"));
console.log(Date.parse("2022/3/13 15:23:37"));
console.log(Date.parse("2022. 03. 13 15:23:37"));
console.log(Date.parse("Sunday, 3/13/2022 15:23:37"));
console.log(Date.parse("Sunday, March 13, 2022 15:23:37"));
console.log(Date.parse("Sun Mar 13 2022 15:23:37"));
console.log(Date.parse("Sun, March 13, 2022 15:23:37"));
--> 1647152617000

 

년, 월, 일이 잘 못되거나 ISO 8601로 표기되지 않으면 구문 분석할 수 없기 때문에 NaN이 반환됩니다.

console.log(Date.parse("2022-13-03 15:23:37")); --> 월이 잘 못됨
console.log(Date.parse("2022-03-13 AM 3:23:37")); --> 표기법이 틀림
--> NaN

 

1970년 1월 1일 00시 00분 00초 UTC 이전이면 음수를 반환합니다.

console.log(Date.parse("1969-12-31 15:23:37"));
--> -63383000

 

1970년 1월 1일 00시 00분 00초 UTC를 기준으로 경과된 시간을 계산하면 경과된 년, 경과된 일, 경과된 시간, 경과된 분, 경과된 초를 알 수 있습니다.

// 초 (밀리초)
const seconds = 1000;
// 분
const minute = seconds * 60;
// 시
const hour = minute * 60;
// 일
const day = hour * 24;
// 년
const year = day * 365;

var elapsedTime = Date.parse("2022-03-13 15:23:37");

console.log(Math.round(elapsedTime / seconds));
--> 1647152617
console.log(Math.round(elapsedTime / minute));
--> 27452544
console.log(Math.round(elapsedTime / hour));
--> 457542
console.log(Math.round(elapsedTime / day));
--> 19064
console.log(Math.round(elapsedTime / year));
--> 52

Math.round() 메서드를 사용하여 반올림 처리하였습니다.

위의 계산이 맞을까요?

계산이 틀렸습니다.

첫 번째, UTC 기준으로 경과 시간이 처리되기 때문에 9시간(KST)이 차이가 납니다. 그래서 9시간을 추가해야 입력한 날짜와 시간으로 정확하게 계산됩니다.

두 번째, 4년마다 윤년이 발생하기 때문에 365로 경과된 연도를 계산하면 실제 경과된 연도와 차이가 납니다. 그래서 윤달이 포함되게 계산해야 정확하게 계산됩니다.

그렇지만, KST 기준 시간을 추가해 주면 연도 계산을 제외한 일, 시, 분, 초 계산은 문제없습니다.

 

이제부터 기준 시간 처리와 윤년을 포함하여 다시 계산하겠습니다.

먼저 KST 기준을 위해 9시간을 추가합니다.

elapsedTime += (9 * hour);

 

윤년 계산

연도가 4로 나머지 없이 나누어지면 윤년입니다. (1996년, 2000년, 2004년, 2008년)

연도가 400으로 나머지 없이 나누어지면 윤년입니다. (2000년, 2400년)

그런데 연도가 100으로 나머지 없이 나누어지면 윤년이 아닙니다. (1900년, 2100년)

// 윤년 계산
var yearDay = 365;
if (dateYear % 400 == 0) {
	yearDay = 366;
} else if (dateYear % 100 == 0) {
	yearDay = 365;
} else if (dateYear % 4 == 0) {
	yearDay = 366;
}

 

경과된 시간을 윤년을 포함해서 다시 계산하겠습니다.

// 기준 연도
const baseYear = 1970;
// 계산된 연도
var dateYear = baseYear;
// 경과된 연도
var elapsedYear = 0;
// 경과된 연도의 시간
var elapsedTimeOfYear = 0;

while(true) {
	// 윤년 계산
	var yearTime = 365 * day;
	if (dateYear % 400 == 0) {
		yearTime = 366 * day;
	} else if (dateYear % 100 == 0) {
		yearTime = 365 * day;
	} else if (dateYear % 4 == 0) {
		yearTime = 366 * day;
	}
	if (elapsedTime > 0) {
		elapsedTimeOfYear += yearTime;
		if (elapsedTime <= elapsedTimeOfYear) {
			elapsedYear = dateYear - baseYear;
			elapsedTimeOfYear -= yearTime;
			break;
		}
		dateYear++;
	} else {
		// 1970년 1월 1일 00시 00분 00초 UTC 이전 처리
		dateYear--;
		elapsedTimeOfYear -= yearTime;
		if (elapsedTimeOfYear <= elapsedTime) {
			elapsedYear = baseYear - dateYear - 1;
			elapsedTimeOfYear += yearTime;
			break;
		}
	}
}

console.log(elapsedYear);
--> 52
console.log(dateYear);
--> 2022

 

계산 결과는 똑같지만 경과 시간으로 월, 일, 시, 분, 초를 계산할 때는 기준 시간 추가와 윤달을 포함한 계산으로 정확하게 계산할 수 있습니다.

728x90
반응형