일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- KDT 프로그래머스 데브코스 프론트엔드
- TypeScript 문법 소개
- Vue3
- 백준 node.js
- 모던 javascript Deep Dive
- 투포인터알고리즘 js
- 인프런 자바스크립트 알고리즘 문제풀이
- react 프로젝트 리팩토링
- K_Digital Training
- Vue3 Router
- frontend roadmap study
- 모던 자바스크립트 Deep Dive TIL
- 개발자 특강
- 모던 자바스크립트 TIL
- 우테캠 회고록
- 프로그래머스 K_Digital Training
- 모던 자바스크립트 딥다이브
- KDT 프로그래머스
- 프로그래머스 데브코스 프론트엔드
- react customHook 예시
- 프로그래머스 K_Digital Training 프론트엔드
- 프로그래머스 데브코스
- 프로그래머스 데브코스 프론트엔드 TIL
- Frontend Roadmap
- 모던 자바스크립트 Deep Dive
- 머쓱이
- useEffect return
- 리팩토링 회고
- useRef 지역 변수
- 백준 js
- Today
- Total
프론트엔드 개발자의 기록 공간
[JavaScript DeepDive] 30장_Date 본문
표준 빌트인 객체인 Date는 날짜와 시간을 위한 메서드를 제공하는 빌트인 객체이면서 생성자 함수다.
UTC(협정 세계시)는 국제 표준시를 말한다. UTC는 GMT(그리니치 평균시)로 불리기도 한다. 기술적인 표기에서는 UTC가 사용된다.
KST(한국 표준시)는 UTC에 9시간을 더한 시간이다. 즉, 9시간이 더 빠르다.
현재 날짜와 시간은 자바스크립트 코드가 실행된 시스템의 시계에 의해 결정된다.
✍ Date 생성자 함수
Date는 생성자 함수다. Date 생성자 함수로 생성한 Date 객체는 내부적으로 날짜와 시간을 나타내는 정수값을 갖는다. Date 생성자 함수로 객체를 생성하는 방법은 다음과 같이 4가지가 있다.
📌 New Date()
Date 생성자 함수를 인수 없이 new 연산자와 함께 호출하면 현재 날짜와 시간을 가지는 Date 객체를 반환한다. Date 객체는 내부적으로 날짜와 시간을 나타내는 정수값을 갖지만 Date 객체를 콘솔에 출력하면 기본적으로 날짜와 시간 정보를 출력한다.
new Date(); // -> Mon Jul 06 2020 01:03:18 GMT+0900 (대한민국 표준시)
Date 생성자 함수를 new 연산자 없이 호출하면 Date 객체를 반환하지 않고 문자열을 반환한다.
Date(); // -> "Mon Jul 06 2020 01:10:47 GMT+0900 (대한민국 표준시)"
📌 New Date(milliseconds)
Date 생성자 함수에 숫자 타입의 밀리초를 인수로 전달하면 1970년 1월 1일 00:00:00(UTC)을 기점으로 인수로 전달된 밀리초만큼 경과한 날짜와 시간을 나타내는 Date 객체를 반환한다.
// 한국 표준시 KST는 협정 세계시 UTC에 9시간을 더한 시간이다.
new Date(0); // -> Thu Jan 01 1970 09:00:00 GMT+0900 (대한민국 표준시)
/*
86400000ms는 1day를 의미한다.
1s = 1,000ms
1m = 60s * 1,000ms = 60,000ms
1h = 60m * 60,000ms = 3,600,000ms
1d = 24h * 3,600,000ms = 86,400,000ms
*/
new Date(86400000); // -> Fri Jan 02 1970 09:00:00 GMT+0900 (대한민국 표준시)
📌 New Date(dateString)
Date 생성자 함수에 날짜와 시간을 나타내는 문자열을 인수로 전달하면 지정된 날짜와 시간을 나타내는 Date 객체를 반환한다. 이때 인수로 전달한 문자열은 Date.parse 메서드에 의해 해석 가능한 형식이어야 한다.
new Date('May 26, 2020 10:00:00');
// -> Tue May 26 2020 10:00:00 GMT+0900 (대한민국 표준시)
new Date('2020/03/26/10:00:00');
// -> Thu Mar 26 2020 10:00:00 GMT+0900 (대한민국 표준시)
📌 New Date(year, month[,day, hour, minute .....])
Date 생성자 함수에 연, 월, 일, 시, 분, 초, 밀리초를 의미하는 숫자를 인수로 전달하면 지정된 날짜와 시간을 나타내는 Date 객체를 반환한다. 이때 여느 월은 반드시 지정해야한다. 지정하지 않은 옵션은 0 또는 1로 초기화 된다. (주의 month(월)은 0부터 시작한다. 0 = 1월, 11 = 12월)
// 월을 나타내는 2는 3월을 의미한다. 2020/3/1/00:00:00:00
new Date(2020, 2);
// -> Sun Mar 01 2020 00:00:00 GMT+0900 (대한민국 표준시)
// 월을 나타내는 2는 3월을 의미한다. 2020/3/26/10:00:00:00
new Date(2020, 2, 26, 10, 00, 00, 0);
// -> Thu Mar 26 2020 10:00:00 GMT+0900 (대한민국 표준시)
// 다음처럼 표현하면 가독성이 훨씬 좋다.
new Date('2020/3/26/10:00:00:00');
// -> Thu Mar 26 2020 10:00:00 GMT+0900 (대한민국 표준시)
✍ Date 메서드
📌 Date.prototype.get연도, 월, 일, 요일, 시간 관련 메서드
new Date('2020/07/24').getFullYear(); // -> 2020
// 0월 부터 시작 0 = 1월 11 = 12월
new Date('2020/07/24').getMonth(); // -> 6
new Date('2020/07/24').getDate(); // -> 24
new Date('2020/07/24').getDay(); // -> 5
new Date('2020/07/24/12:00').getHours(); // -> 12
new Date('2020/07/24/12:30').getMinutes(); // -> 30
new Date('2020/07/24/12:30:10').getSeconds(); // -> 10
set 메서드를 이용하여 설정도 할 수 있다.
📌 Date.prototype.getTimezoneOffset
UTC와 Date 객체에 지정된 로캘(locale) 시간과의 차이를 분 단위로 반환한다. KST는 UTC에 9시간을 더한 시간이다. 즉, UTC = KST - 9h다.
const today = new Date(); // today의 지정 로캘은 KST다.
//UTC와 today의 지정 로캘 KST와의 차이는 -9시간이다.
today.getTimezoneOffset() / 60; // -9
📌 Date.prototype.toISOString
ISO 8601 형식으로 Date 객체의 날짜와 시간을 표현한 문자열을 반환한다.
const today = new Date('2020/7/24/12:30');
today.toString(); // -> Fri Jul 24 2020 12:30:00 GMT+0900 (대한민국 표준시)
today.toISOString(); // -> 2020-07-24T03:30:00.000Z
today.toISOString().slice(0, 10); // -> 2020-07-24
today.toISOString().slice(0, 10).replace(/-/g, ''); // -> 20200724
📌 Date.prototype.toLocalString
인수로 전달한 로캘을 기준으로 Date 객체의 날짜와 시간을 표현한 문자열을 반환한다. 인수를 생략한 경우 브라우저가 동작 중인 시스템의 로캘을 적용한다.
const today = new Date('2020/7/24/12:30');
today.toString(); // -> Fri Jul 24 2020 12:30:00 GMT+0900 (대한민국 표준시)
today.toLocaleString(); // -> 2020. 7. 24. 오후 12:30:00
today.toLocaleString('ko-KR'); // -> 2020. 7. 24. 오후 12:30:00
today.toLocaleString('en-US'); // -> 7/24/2020, 12:30:00 PM
today.toLocaleString('ja-JP'); // -> 2020/7/24 12:30:00
📌 Date.prototype.toLocalTimeString
인수로 전달한 로캘을 기준으로 Date 객체의 시간을 표현한 문자열을 반환한다. 인수를 생략한 경우 브라우저가 동작 중인 시스템의 로캘을 적용한다.
const today = new Date('2020/7/24/12:30');
today.toString(); // -> Fri Jul 24 2020 12:30:00 GMT+0900 (대한민국 표준시)
today.toLocaleTimeString(); // -> 오후 12:30:00
today.toLocaleTimeString('ko-KR'); // -> 오후 12:30:00
today.toLocaleTimeString('en-US'); // -> 12:30:00 PM
today.toLocaleTimeString('ja-JP'); // -> 12:30:00
✍ Date를 활용한 시계 예제
(function printNow() {
const today = new Date();
const dayNames = [
'(일요일)',
'(월요일)',
'(화요일)',
'(수요일)',
'(목요일)',
'(금요일)',
'(토요일)'
];
// getDay 메서드는 해당 요일(0 ~ 6)을 나타내는 정수를 반환한다.
const day = dayNames[today.getDay()];
const year = today.getFullYear();
const month = today.getMonth() + 1;
const date = today.getDate();
let hour = today.getHours();
let minute = today.getMinutes();
let second = today.getSeconds();
const ampm = hour >= 12 ? 'PM' : 'AM';
// 12시간제로 변경
hour %= 12;
hour = hour || 12; // hour가 0이면 12를 재할당
// 10미만인 분과 초를 2자리로 변경
minute = minute < 10 ? '0' + minute : minute;
second = second < 10 ? '0' + second : second;
const now = `${year}년 ${month}월 ${date}일 ${day} ${hour}:${minute}:${second} ${ampm}`;
console.log(now);
// 1초마다 printNow 함수를 재귀 호출한다. 41.2.1절 "setTimeout / clearTimeout" 참고
setTimeout(printNow, 1000);
}());
위의 코드를 활용하면 Date 관련 각종 예시에서 연도, 월, 일, 요일, 시간 등을 쉽게 사용할 수 있다.
👨💻 프로젝트나 코테 문제에서 시간을 많이 이용할 때가 있는데 그때마다 항상 구글링을 하면서 Date 객체를 보고
필요한 부분만 추출해서 사용하곤 했다. 위의 Date를 활용한 시계 예제에 모든 경우를 대부분 다루고 있으므로 잘 이용하면 좋을 것 같다.
'모던 자바스크립트 Deep Dive' 카테고리의 다른 글
[JavaScript DeepDive] 32장_String (0) | 2022.03.02 |
---|---|
[JavaScript DeepDive] 31장_RegExp (0) | 2022.03.02 |
[JavaScript DeepDive] 29장_Math (0) | 2022.03.01 |
[JavaScript DeepDive] 28장_Number (0) | 2022.02.28 |
[JavaScript DeepDive] 27장_배열 (0) | 2022.02.28 |