DateTime과 Duration
Flutter에서 날짜와 시간을 다룰 때 DateTime과 Duration 클래스를 사용한다.
DateTime은 날짜를 표현하는 클래스이고, Duration은 기간을 표현하는 클래스이다.
DateTime 기본 사용법 1
- 년, 월, 월, 일, 시, 분, 초, 밀리초, 마이크로 초에 해당되는 값들을 순서대로 입력하면 된다.
DateTime 클래스를 인스턴스화하여 date라는 변수를 생성한 것이다.
위 코드 이미지대로, 순서대로 포지셔널 파라미터를 넣을 수가 있다.
예를 들어서, 2024년 9월 5일을 표현하고 싶다면 위와 같이 입력하면 된다.
- 년도만 필수 입력이고, 나머지는 옵셔널(선택적)이다.
최소한 무언가 하나는 입력을 해줘야 한다. 몇 년도인지는 알아야 하기 때문이다.
나머지는 옵셔널(선택적)다.
그렇기 때문에 연도만 입력을 해주면 나머지는 그냥 입력을 안 해도 된다.
- 옵셔널 값을 입력안할 경우 월, 일은 기본값이 1로 입력되고, 나머지는 0이 입력된다.
2024년이라고 2024만 필수값을 입력을 해줬다면은 1월 1일 0시 0분 0초 0밀리초 0마이크로 초가 되는 것이다.
만약연도랑 날짜만, 1만 넣고 싶다는 생각이 들 수 있는데, 이는 말이 안되는 생각이다.
2024년도에 23일인데 몇월인지를 모른 23일은 있을 수가 없기 때문이다.
DateTime 기본 사용법 2
- DateTime의 utc 네임드 생성자를 사용하면, utc 기준으로 날짜와 시간을 생성할 수 있다.
UTC는 뭐냐면은 Coordinated Universal Time의 약자이다.
이게 조금 순서가 바뀌었지만, UTC라고 부른다.
쉽게 말하면은 지구에서 시간대가 나라마다 모두 다르다.
우리나라 같은 경우에는 기준 시간대 기준으로 9시간을 더해서 계산을 하게 되는데, 정확히 0시가 되는 기준이 UTC 이다.
UTC 란?
UTC가 00시일 때, 한국은 9시이다.
그래서 한국에서 9시인데 다른 곳에서는 몇 시인가라는 걸 계산할 때 이 타임존 UTC를 갖고서 계산을 하게 된다.
DateTime.now 사용법
실행 결과:
2024-09-06 13:40:31.002
DateTime.now()라고 하면 now라는 변수 무엇을 반환을 받게 되냐면, 현재 날짜와 시간이 저장이 된다.
원래는 DateTime을 DateTime 기본 사용법처럼 클래스 혹은 생성자에 특정 시간을 넣었어야 됐는데, 특정 시간과 날짜를 원하는 게 아니고 지금 이 순간의 날짜 시간을 원한다 라고 하면 네임드 생성자인 .now()를 실행해 주면 된다.
Duration 기본 사용법
DateTime은 특정 날짜와 시간을 표현을 한다면은 Duration은 기간을 표현하는 클래스이다.
- 날짜, 시간, 분, 초, 밀리초, 마이크로 초를 Named Parameter로 입력할 수 있다.
여기서도, DateTime 클래스처럼 값을 넣어줄 수가 있다.
하지만 DateTime은 포지셔널 파라미터였지만, Duration 같은 경우에는 네임드 파라미터를 사용을 하고 있다.
왜냐하면 Duration을 통해, 날짜 말고 시간만 입력하고 싶을 수가 있고, 시간 말고 분만 입력하고 싶을 수가 있고, 날짜랑 초만 입력하고 싶을 수가 있고, 여러가지 믹스를 해야 되는 상황이 생길 수가 있기 때문에 네임드 파라미터를 사용하고 있다.
전부 다 1을 넣어주면 당연히 하루, 1시, 1분, 1초, 1밀리초, 1마이크로초가 된다.
- 값을 입력하지 않으면 모든 값은 0으로 초기화 된다.
당연히 값을 입력하지 않는다면 모든 값들은 0으로 초기화가 된다.
DateTime의 add() 함수와 subtract() 함수
일단은 DateTime을 사용해서 date 인스턴스 변수에 날짜 생성을 하였다.
2024, 9, 6을 넣었기 때문에, 2024년 9월 6일이 된다.
Duration을 통해 duration 인스턴스 기간을 만들어서 days 네임드 파라미터에 1을 넣었다.
Duration에 입력한 기간만큼 우리가 날짜를 더하거나 뺄 때 다음과 같은 함수를 통해 연산이 가능하다.
- add() 함수는 Durauion 기간만큼 기간을 더할(늘릴) 수 있다.
2024년 9월 6일을 DateTime에 입력을 했지만, 1일이라는 값을 가지고 있는 duraion 인스턴스 변수를 date 변수에 add 함수를 통해 추가를 해주면은 2024년 9월 6일이 2024년 9월 7일이 된다.
정확히 년도와 월 일만 DateTime 클래스를 통해 인스턴스에 저장을 하였으니 DateTime 인스턴스의 나머지 값들은 모두 0이 된다.
- subtract() 함수는 Durauion 기간만큼 기간을 뺄(줄일) 수 있다.
subtract는 뺴기 이기 떄문에, 2024년 9월 6일이 2024년 9월 5일이 된다.
DateTime의 isAfter() 함수와 isBefore() 함수, isAtSameMomentAs() 함수
DateTime의 인스턴스 date1 변수에 2023년 9월 6일을 넣었고, 인스턴스 date2 변수를 하나 더 만들어서 2024년 9월 6일을 넣었다.
날짜를 비교할 때는 다음과 같은 함수를 사용한다.
- isAfter() 함수는 Parameter로 입력한 비교 대상 DateTime의 인스턴스가 이후의 날짜면 ture를 반환한다.
date1 인스턴스 변수가 date2 인스턴스 변수 보다 이후의 날짜인지 확인하는 함수이다.
date1 인스턴스 변수값은 2023년 9월 6일이고, date2 인스턴스 변수 값은 2024년 9월 6일이기 때문에 false 값이 나온다.
- isBefore() 함수는 Parameter로 입력한 비교 대상 DateTime의 인스턴스가 이의 날짜면 ture를 반환한다.
date1 인스턴스 변수가 date2 인스턴스 변수 보다 이전의 날짜인지 확인하는 함수이다.
date1 인스턴스 변수값은 2023년 9월 6일이고, date2 인스턴스 변수 값은 2024년 9월 6일이기 때문에 true 값이 나온다.
- isAtSameMomentAs() 함수는 Parameter로 입력한 비교 대상 DateTime의 인스턴스가 같은 날짜면 true를 반환한다.
date1 인스턴스 변수가 date2 인스턴스 변수와 똑같은 날짜인지 확인하는 함수이다.
이때 연, 월, 날짜, 시간, 분, 초, 마이크로초, 밀리초까지 모두 같은지 확인한다.
date1 인스턴스 변수 값은 2023년 9월 6일이고, date2 인스턴스 변수 값은 2024년 9월 6일이기 때문에 false 값이 나온다.
DateTime의 toUtc() 함수와 toLocal() 함수
UTC 시간과 현지 시간을 서로 변환할 때는 다음과 같은 함수를 사용한다.
- toUtc() 함수는 현지 날짜를 UTC 기준 날짜로 변경한다.
date 인스턴스 변수에 toUtc() 함수를 호출하면, 현지 날짜를 UTC 기준 날짜로 변경한다.
한국은 UTC 기준으로 9시간을 더한 시간으로 계산하기 때문에, DateTime을 통해 인스턴스화된 변수에 값을 9시간 뺀 결과 값인 2024년 9월 5일 15시가 나온다.
15시 00분 00초 000 한 다음에 끝에 Z가 있다.
Z가 뭐냐면은 Z가 끝에 있을 때는 UTC 기준이라는 뜻이다.
Z가 없으면 현지 시간이라는 것이다.
- toLocal() 함수는 UTC 기준 날짜를 현지 날짜로 변경한다.
UTC 시간을 생성을 했는데 UTC 시간을 거꾸로 현지 시간으로 다시 바꾸고 싶다라고 하면 어떻게 해야 되냐?
utcDate변수에 toLocal()이라는 함수를 실행을 해주면 된다.
그러면 끝에 보면 Z가 다시 사라지고, 처음에 저장했던 2024년도 9월 6일이 다시 출력이 된다.