[Swift] 날짜를 얻고 차이를 내는 방법

12138 단어 iOSSwiftdateSwiftUIGit

이번에 만든 앱





소개



이번은 유닛 테스트에 대해 배우고 싶은 공부하고 있었던 곳 "Date 사용해 테스트 쓰면 좋겠다"라고 하는 어드바이스를 받았으므로 도전해 보면 Date에 관해서 상당히 공부가 되었으므로 정리해 보았습니다.
또한 UIKit과 SwiftUI 모두에서 써 보았으므로 UIKit은 Git에서 공개하고,이 기사에서는 주로 SwiftUI로 쓴 것을 게재하고 있습니다.

환경



· macOS Big Sur 12
· Xcode : 12.5

날짜 얻기




 @State var dateText = ""
    var body: some View {
        VStack {
            Button(action: {
                let date = Date()
                dateText = "\(date)"
            }, label: {
                Text("Button")
            })
            Text(dateText)
        }
    }

버튼을 누르면 현재의 일시를 취득해 표시한다.

Formatter를 사용하여 디스플레이 정의



단지 표시하는 것만으로 기본적으로 별로 사용하는 일은 없기 때문에 기본”Date 사용한다면 Formatter”정도의 기세로 필요한 생각이 든다.
시간과 분만을 표시시키고 싶은 경우는 아래와 같이(Button의 action내 이외는 생략)

let date = Date()
let dateFormat = DateFormatter()
dateFormat.dateFormat = "HH:mm"
dateText = dateFormat.string(from: date)

.dateFormat에서는 표시하는 일시의 표현을 정의할 수 있다. 하기 표에 정리하였다.





시간




YYYY
MM
dd
HH
mm
ss

2021
6
3
22
26
45


지역 및 언어의 경우 Locale 사용


dateFormat.locale = Locale(identifier: "jp_JP")

Locale에서 사용할 ID 목록 ↓

지역별 시간을 얻으려면 TimeZone 사용


dateFormat.timeZone = TimeZone(identifier: "Asia/Tokyo")

TimeZone에서 사용할 ID 목록↓

일본 달력에 조심하다



이것도 처음 몰랐던 부분이지만, iPhone의 설정으로 화력을 설정하고 있으면 YYYY의 기원 표시의 부분이 엉망인 숫자를 돌려주는 때가 있다.
위를 방지하려면
.timeStyle과 .dateStyle을 정의하는 것이 좋습니다.

  let dateFormat = DateFormatter()
                dateFormat.timeStyle = .full
                dateFormat.dateStyle = .full
                dateFormat.locale = Locale(identifier: "ja_jp")
                let date = Date()
                dateText = dateFormat.string(from: date)

Local을 en_US로 변경하면 표시가 다음과 같이 바뀝니다.


dateFormat.dateFormat = "YYYY/MM/dd HH:mm :ss"를 dateFormat.locale = Locale(identifier: "ko_kr") 아래에 추가하면 다음과 같이 표시됩니다.


시간 차이를 얻고 싶다면



timeIntervalSince를 사용하면 차이를 쉽게 얻을 수 있습니다.
  @State var dateText = ""
    @State var timeZone = ""
    var body: some View {
        VStack {
            Button(action: {
                let dateFormat = DateFormatter()
                // 日時をString型で定義
                let textLogDate = "2021-01-01 12:00:00"
                let textNowDate = "2021-01-01 12:01:20"
                dateFormat.timeStyle = .full
                dateFormat.dateStyle = .full
                // dateFormatを初期設定した"2021-01-01 12:00:00"と同じ形式になるように定義
                dateFormat.dateFormat = "yyyy-MM-dd HH:mm:ss"
                // localeを日本に
                dateFormat.locale = Locale(identifier: "ja_JP")
                // timeZoneを日本に
                dateFormat.timeZone = TimeZone(identifier: "Asia/Tokyo")
                // String型の日時をDate型に変換
                timeZone = dateFormat.string(from: Date())
                let logDate = dateFormat.date(from: textLogDate) ?? Date()
                let nowDate = dateFormat.date(from: textNowDate) ?? Date()
                // timeIntervalSinceを使用すると差分を取得できる->nowDate-logDate
                let dateSubtraction: Int = Int(nowDate.timeIntervalSince(logDate))
                dateText = "\(dateSubtraction)"
            }, label: {
                Text("Button")
            })
            Text(dateText)
            Text(timeZone)
        }
    }
}

시간은 일본 시간을 표시하고 있어 취득한 차분은 초수의 차분이 되므로, 이번은 80초로 표시된다.


이상 앞으로를 사용하여 날짜와 시간의 차이를 얻는 앱을 만들어 단위 테스트를 작성해 보았습니다. (여기는 UIKit로 썼습니다)
htps : // 기주 b. 코 m / 유지 오카 / 치메 카 l

요약



그 이상 TimeZone과 Locale 목록과 timeIntervalSince를 사용하여 차이를 얻는 방법이었습니다.

좋은 웹페이지 즐겨찾기