1. Date 생성자 함수
자바스트립트에서 날짜를 생성하는 방법은 두가지다.
첫 번째는 Date() 함수만 호출하는 방법, 두 번째는 new Date() 로 호출하는 방법이다.
Date() 로 생성한 날짜는 문자열을 반환하고, new Date()로 생성한 경우 새로운 Date 객체를 반환한다.
즉 Date()함수로 호출한 값은 String이라 replace, length 같은 String 메서드만 사용할 수 있다.
new Date() 생성자로 호출한 경우 새로운 getDate(), getDay() 와 같은 메서드를 사용할 수있다.
생성자 함수로 생성한 Date 객체는 내부적으로 날짜와 시간을 나타내는 정수값을 가진다.
기본적으로는 현재 날짜와 시간을 나타내는 정수값을 가지는데
현재 날짜와 시간이 아닌 다른 날짜와 시간을 다루고 싶은 경우 Date 생성자 함수에 명시적으로 해당 날짜와 시간 정보를 인수 정보로 지정해야한다.
new Date()
new 연산자와 함께 호출하면 현재 날짜와 시간을 가지는 Date 객체를 반환한다.
만약에 new 연산자 없이 호추랗면 Date 객체를 반환하지 않고 날짜와 시간 정보를 나타내는 문자열을 반환한다.
new Date(milliseconds)
Date 생성자 함수에 숫자 타입의 밀리초를 인수로 전달하면 인수로 전달된 밀리초만큼 경과한 날짜와 시간을 나타내느 Date 객체를 반환한다.
new Date(dateString)
Date 생성자 함수에 날짜와 시간을 나타내는 문자열을 인수로 전달하면 지정된 날짜와 시간을 나타내는 객체를 반환하낟.
new Date(year,month [,day,hour,minute,second,millisecond])
연,월,일,시,분,초 밀리초를 의미하는 숫자를 인수로 전달하면
지정된 날짜와 시간을 나타내는 Date 객체를 반환한다.
이때 연, 월은 반드시 지정해야 한다.
지정하지 않은 옵션 정보는 0 또는 1로 초기화한다.
만약 연, 월을 지정하지 않은 경우 1970년 1월 1일 00:00:00 을 나타내는 Date 객체를 반환한다.
2. Date 메서드
Date.now();
-> 1월 1일 00:00:00을 기점으로 현재 시간까지 경과한 밀리초를 숫자로 반환한다.
Date.parse();
-> 인수로 전달된 지정시간의 인수와 동일한 형식까지의 밀리초를 숫자로 반환한다.
new Date('2020/06/30').getFullYear();
//2020
const today = new Date();
//년도 지정
//월, 일도 지정가능함
today.setFullYear(1900,0,1);
today.getFullYear(); //1900
-> Date 객체의 연도를 나타내는 정수 반환한다. 연도 이외에 옵션으로 월, 일도 설정가능함
//Date.prototype.toDateString
//사람이 읽을 수 있는 형식의 문자열로 Date 객체의 날짜 반환함
const today = new Date('2020/06/30');
const todaytoday = today.toString();
console.log(todaytoday);
//Tue Jun 30 2020 00:00:00 GMT+0000
-> 사람이 읽을 수 있는 형식으로 Date 객체의 시간을 표현한 문자열을 반환함
그런데 Date 객체를 사용하는 것이 위험할 수 있다고??
먼저 자바스크립트의 Date 객체의 결과물을 다시한번 봐보장
let date = new Date(0);
console.log(date);
// Thu Jan 01 1970 09:00:00 GMT+0900 (한국 표준시)
// KST(Korea Standard Time)는 GMT(그리니치 평균시: Greenwich Mean Time)에 9시간을 더한 시간이다
이렇게 출력값이 GMT+0900 으로 나온다.
여기서 GMT 는 그리니치 평균시 를 의미한다.
즉 GMT+0900 는 영국의 시간보다 9시간을 앞선 시간을 의미한다.
그러나~~ GMT는 현재 국제 표준으로 삼고있는 시간이 아니기 때문에 UTC 라는 개념을 도입한다.
그래도~ UTC 에서 시간대를 나누는 기준은 GMT와 동일하므로 자바스크립트에서는 둘을 사실상 똑같이 여겨 두 용어를 그냥 혼용해서 쓰고 있다.
따라서 GMT 를 기준으로 얼마나 떨어져있는지에 대한 시간으로 나타난다.
이와는 별개로
자바스크립트의 Date 는 같은 날짜와시간을 입력한 것처럼 보임에도 불구하고
컴퓨터 자체의 시간대 설정에 따라 결과가 달라지기도 하고
클라이언트에서 작성한 시간과 서버에서 돌아가는 시간이 달라지는 오류가 일어나기도 한다.
또한
console.log(new Date(Date.parse("Jul 8, 2022")))
//Fri Jul 08 2022 00:00:00 GMT+0900 (대한민국 표준시)
console.log(new Date(Date.parse("2022-07-08")))
//Fri Jul 08 2022 09:00:00 GMT+0900
입력값에 따라 출력값이 달라지는 Date 의 특성 때문에 같은 출력값을 넣어도
다른 결과값이 나올 수 있다. 파싱되는 기준이 다르기 때문이다!
PC 설정된 시간이 KST면 그냥 사용해도 된다.
UTF로 프로그램이 세팅 되어 있다면 안해도 됨 라이브러리를 이용하면 쉽게 세팅 가능
따라서 자바스크립트에서 시간을 나타낼 때에는
- ISO 8601 표준을 준수하여 UTC 인지 현지 시각인지를 명시적으로 표현
- UTC 로 생성한 Date 를 현지 시각 메서드로 출력하거나
- 현지 시각으로 생성한 Date 를 UTC 메서드로 출력하지 않아야 한다.
아무튼 이런 과정들이 복잡하기 때문에...
시간을 나타낼 수 있는 라이브러리를 사용하는 것이 더 좋기는 하당
대표적으로 moment.js 또는 Luxon 등이 있다.
const today = moment();
console.log(
"Today's date is: " +
today.format('YYYY-MM-DD')
);
//Today's date is: 2024-11-07
'Deep Dive 정리' 카테고리의 다른 글
[JS Deep Dive] 34장 - 이터러블 (0) | 2024.11.14 |
---|---|
[JS Deep Dive] 33장 - Symbol (0) | 2024.11.14 |
[JS Deep Dive] 29장 - Math (2) | 2024.11.07 |
[JS Deep Dive] 28장 - Number (0) | 2024.11.07 |
[JS Deep Dive] 27장 - 배열 (3)-스택, 큐 자료구조 (0) | 2024.10.31 |