#04 까지 하고 나면 폴더 구조가 다음과 같다.
Model 폴더는 데이터를 관리하기 위한 폴더로 date_model.dart 에는 날씨 API 외부 시스템과 상호 작용하는 코드가 담겨있다.
View 폴더는 사용자에게 보이는 화면을 위한 폴더로 splash_screen.dart 에는 스플래시 스크린 화면에 대한 코드가 있다. 스플래시 코드 관련 코드
Resources 폴더에는 어플을 구성하는 리소스를 관리하는 파일이 들어있다. images 폴더에는 image assets 관리를 위한 코드가, app_url.dart 은 현재는 날씨 api url 이 담겨있다.
Utilities폴더에는 utilities.dart 파일이 있는데, 이는 MVVM 아키텍처의 주요 구성 요소인 모델(Model), 뷰(View), 뷰모델(ViewModel) 외에도 필요한 추가적인 코드와 함수들을 담고 있다. 예를 들어 네트워크 통신, 데이터베이스 접근, 로깅 등과 같은 어플리케이션의 핵심 기능을 지원하는 서비스들, 문자열 처리, 날짜 및 시간 처리, 수학적 계산과 같은 일반적인 작업을 위한 헬퍼 함수들이 포함된다.
유틸리티 폴더 내에는 헬퍼함수가 포함될 수 있다고 했다.
이번 시간에는 어플 내부에서 사용되는 날짜 및 시간 데이터를 특정 형식으로 변환하기 위한 헬퍼 함수를 정의할 것이다.
헬퍼(helper) 함수
이름에서 알 수 있듯이 헬퍼는 작업을 돕는 것으로 헬퍼 함수는 작업을 도와주는 함수이다. 헬퍼 파일은 단순히 특정 범주의 함수(function) 모음이라고 할 수 있다. 링크를 만드는 데 도움이되는 URL 헬퍼가 있고, 양식 요소를 만드는 데 도움이되는 Form 헬퍼가 있다. Text 헬퍼는 다양한 텍스트 서식 루틴을 수행합니다. Cookie 헬퍼 쿠키 읽기, File 헬퍼는 파일 처리 등을 도와준다.
코드 작성에 앞서 해당 파일은 intl 패키지를 사용하여 날짜 관련 유틸리티 기능들을 제공한다.
imageMap (Map<dynamic, String>) : 날씨 상태를 문자열 키로 하고, 해당 날씨에 맞는 이미지 파일의 경로를 값으로 하는 맵(Map)입니다. 예를 들어, 'Partially cloudy'라는 날씨 상태가 있을 때 'assets/images/nightRain.png'라는 이미지 파일 경로를 반환
formatDate(DateTime date): 주어진 DateTime 객체를 'EEEE d MMM' 형식으로 포맷팅합니다. 이 형식은 요일, 일, 월을 의미합니다. 예를 들어, "Monday 1 Jan"과 같은 형식으로 날짜를 반환
extractDate(String date): 문자열 형태의 날짜 정보를 받아 DateTime 객체로 파싱한 후, 이를 'd' 형식으로 포맷팅하여 일(day)만 반환합니다. 예를 들어, "2021-01-01"을 입력받으면 "1"을 반환
extractDay(String date): 문자열 형태의 날짜 정보를 받아 DateTime 객체로 파싱한 후, 이를 'EEEE' 형식으로 포맷팅하여 요일을 반환합니다. 그리고 반환된 요일 문자열의 첫 세 글자를 추출하여 요일의 약어를 반환합니다. 예를 들어, "2021-01-01"을 입력받으면 "Fri"를 반환
-formatTime(String date): 이 함수는 문자열 형태의 날짜와 시간 정보를 받아서 DateTime 객체로 변환한 다음, 'hh:mm a' 형식으로 포맷팅하여 12시간 형식으로 반환합니다. 예를 들어, "15:30:00"을 입력받으면 "03:30 PM"을 반환
currentTime(): 이 함수는 현재 시간을 가져와서 'hh:mm a' 형식으로 포맷팅
formateTimeWithoutAmPm(String time): 이 함수는 문자열 형태의 시간을 받아서 'hh:mm' 형식으로 포맷팅하여 24시간 형식으로 반환
checkTime(String time): 이 함수는 주어진 시간이 현재 시간과 동일한지 여부를 판단합니다. 먼저 주어진 시간과 현재 시간을 'hh a' 형식으로 포맷팅합니다. 이 형식은 시간(12시간 단위)과 오전/오후만을 나타냅니다. 그리고 두 시간이 동일한지를 비교하여 결과를 불리언(boolean) 값으로 반환
import 'package:intl/intl.dart';
class Utilities
{
static Map<dynamic, String> imageMap =
{
'Partially cloudy' : 'assets/images/nightRain.png',
'Overcast' : 'assets/images/sunSlowRain.png',
'clear' : 'assets/images/wind.png',
'null' : 'assets/images/nightStatRain.png',
};
static String formatDate(DateTime date){
String formattedDate = DateFormat('EEEE d MMM').format(date);
return formattedDate;
}
// data : 날짜를 의미
static String extractDate(String date){
DateTime dateTime = DateTime.parse(date);
String formattedDate = DateFormat('d').format(dateTime);
return formattedDate;
}
// day : 요일을 의미
static String extractDay(String date){
DateTime dateTime = DateTime.parse(date);
String formattedDate = DateFormat('EEEE').format(dateTime);
String abreviatedDay = formattedDate.substring(0,3);
return abreviatedDay;
}
static String formatTime(String date){
DateFormat dateFormat = DateFormat('hh:mm a');
DateTime dateTime = DateTime.parse(date);
String timeIn12HourFormat = dateFormat.format(dateTime);
return timeIn12HourFormat; //3:30pm
}
static String currentTime(){
DateFormat dateFormat = DateFormat('hh:mm a');
DateTime now = DateTime.now();
String time = dateFormat.format(now);
return time;
}
static String formateTimeWithoutAmPm(String time){ //15:30
DateFormat dateFormat = DateFormat('hh:mm');
DateTime dateTime = DateTime.parse(time);
String timeIn24HourFormat = dateFormat.format(dateTime);
return timeIn24HourFormat;
}
static bool checkTime(String time)
{
DateFormat dateFormat = DateFormat("hh a'");
DateTime dateTime = DateTime.parse(time);
DateTime now = DateTime.now();
return dateFormat.format(now) == dateFormat.format(dateTime);
}
}