날짜를 다뤄보자!

3 답변 글타래를 보이고 있습니다
  • 글쓴이
    • 성훈
      참가자
      • 글작성 : 2
      • 답글작성 : 14

      Swift에서는 Date를 이용하여 날짜를 정의할 수 있습니다.

      그리고 많은 분들이 이미 DateFormatter를 이용하여 String을 날짜로 바꾸거나 날짜를 문자열로 변경하시고 계실겁니다

      let dateFormatter = DateFormatter()
      dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
      
      let date = dateFormatter.date(from: "2020-03-26 11:41:36")
      print(date) // Optional(2020-03-26 02:41:36 +0000)
      

      하지만 DateFormatter만으로는 날짜를 다루는데에 한계가 있습니다. 그래서 날짜를 좀 더 쉽게 다룰수 있도록 도와줄 Calendar에 대해 이야기 해보겠습니다.

      Calendar는 많은 기능을 담고 있습니다. 이번에는 간략한 몇가지만 알아보겠습니다.

      • 달이나 시간등 특정 시간 값 가져오기
      let calendar = Calendar.current
      
      let date = dateFormatter.date(from: "2020-03-26 11:41:36")
      let hourComponents = calendar.dateComponents([.hour], from: date!)
      let hour = hourComponents.hour
      
      print(hour) // Optional(11)
      
      • 특정 시간값 변동하기
      let calendar = Calendar.current
      
      let date = dateFormatter.date(from: "2020-03-26 11:41:36")
      let afterHour = calendar.date(byAdding: .hour, value: 1, to: date!)
      print(date)
      print(afterHour)
      
      • 날짜가 오늘인지 확인
      let calendar = Calendar.current
      
      let isToday = calendar.isDateInToday(Date())
      print(isToday) // true
      
      // 오늘 뿐만 아니라 어제, 내일, 그리고 주말인지 확인할 수도 있다
      /*
      calendar.isDateInTomorrow(Date())
      calendar.isDateInYesterday(Date())
      calendar.isDateInWeekend(Date())
      */
      

      이 외에도 Calendar는 다양한 기능을 가지고 있습니다. 두개의 날짜가 같은 날짜인지도 비교하고 기준일을 인자로 받아 다음 주말이 언제인지도 확인할 수도 있습니다.

      avataravataravataravatar
    • 야곰
      키 마스터
      • 글작성 : 37
      • 답글작성 : 556

      좋은팁이네요! Date를 사용하는 것보다 Calendar를 사용하는 것이 더 용이한 경우는 어떤때일까요?

    • 성훈
      참가자
      • 글작성 : 2
      • 답글작성 : 14

      저는 Date는 자료형일 뿐이고, 이 자료형을 다루는 확장기능을 DateFormatterCalendar를 통하여 제공하고 있다고 생각합니다.
      그래서 Date자료를 어떻게 활용할 지에 따라 DateFormatterCalendar중에 선택하여 기능을 구현합니다.

      DateFormatter의 경우 Date를 표현해야 할 경우 적합한 포맷과 지역을 설정하여 사용하도록 하고,
      CalendarDate의 정보를 산술적인 계산을 필요로 할 때 활용합니다.

      이는 Date의 애플문서에 소개된 내용입니다.
      Date

      위에서 소개된 여러 기능들도 Date만을 이용하여 구현한다던지, DateFormatter를 이용하여 구현할 수도 있습니다.
      다만 각각의 역할에 특화된 기능을 선택하여 구현함으로써 보다 간결하게 코드를 작성할 수 있습니다.

      덧붙여, 위의 예시에서 사용된 Calendarcurrent는 싱글톤 객체가 아닙니다. 말 그대로 Calendar의 기능을 호출 시점에 설정 기준으로 Calendar가 생성하게 되며, 이를 잘못 이해할 경우 각각의 호출 시점 사이에 사용자가 달력 설정을 바꿈으로써 의도치 않게 다른 결과를 가져올 수 있습니다.

      let calendar1 = Calendar.current
      
      // do Something
      
      let calendar2 = Calendar.current
      

      이 코드에서 calendar1의 달력 기준은 calendar2와 다를 수 있습니다.

      이러한 변경을 막기 위해선 다음과 같이 수정할 필요가 있습니다.

      let calendar1 = Calendar.autoupdatingCurrent
      
      // do Something
      
      let calendar2 = Calendar.autoupdatingCurrent
      

      Calendar에 대한 더 자세한 설명은 아래 공식문서를 참고해 주세요
      Calendar

      avataravatar
      • 야곰
        키 마스터
        • 글작성 : 37
        • 답글작성 : 556

        좋은 설명 고맙습니다!

    • 멍단비
      참가자
      • 글작성 : 10
      • 답글작성 : 98

      Date만 써봤었는데 Calendar도 써봐야겠네요. 잘봤습니다.

3 답변 글타래를 보이고 있습니다
  • 답변은 로그인 후 가능합니다.

logo landscape small

사업자번호 : 260-27-00477
통신판매업 신고번호 : 제 2020-충북청주-0663 호
고객센터 : 카카오톡채널 @yagom