[Swift] TimeZone 초기화 시 주의사항 [여름철]

8769 단어 SwiftiOS

TimeZone 초기화


일본 시간은 그리니치 표준시간인 GMT보다 +9시간이다.
swift의 Date형은 GMT 데이텀이기 때문에 Date 포맷기 등을 통해 문자열로 변환된 경우
TimeZone을 일본 시간으로 지정해야 합니다.
TimeZone 초기화는 identifier의 지정과 GMT로부터의 시간차에 따라 지정하는 방법이 있습니다.
아무래도 결과적으로 시간이 +9시간 조정되기 때문에 좋아하는 사람을 사용할 수 있다.
identifier
TimeZone(identifier: "Asia/Tokyo")
GMT
TimeZone(secondsFromGMT: 9 * 60 * 60) // 9時間分の秒数
TimeZone - Foundation | Apple Developer Documentation
https://developer.apple.com/documentation/foundation/timezone

TimeZone 동작 검증


계속 생각했어요.
실제로 각자의 지정에서 시간의 표현은 차이가 난다...
UIDatePicker에 설정된 시간을 레이블에 표시하고 확인합니다.

1970년 1월 1일


그러면 우선 UNIX 시간의 하한치인 1970년부터 시작합니다.1970/1/1 00:00:00
위의 레이블은 DatePicker에서 선택한 날짜를 DateFormatter에서 String으로 변환하는 것입니다.
표시 중입니다.
또한 DatePicker의 TimeZone은 identifier: "Asia/Tokyo" 에서 지정합니다.
날짜 형식은 secondsFromGMT: 9 * 60 * 60 에서 지정됩니다.
둘 다 +9시간 조정이기 때문에 표기는 물론1970/1/1 00:00:00이다.

1955년 2월 24일


다시 시간을 거슬러 아이폰을 만들어 본 스티브 잡스의 생일.1955/2/24 00:00:00
이쪽도 문제 없어요1955/2/24 00:00:00.

1951년 9월 8일


다음은 애플 본사 근처 샌프란시스코에 사과드리겠습니다.
우리는 샌프란시스코와 조약이 체결된 그날로 거슬러 올라갈 수 있다.1951/9/8 00:00:00
!!??
뭐랄까!!
태그로 변환 1951/9/7 23:00:00일본 시간인데.

일본의 여름철


따라서 identifier 에서 및 secondsFromGMT 에서 지정
한 시간 차이가 났다.
실제로 1950년경 일본은 여름철을 채택했다
이런 차이가 생길 것 같습니다.
70년 전 일본에서 실시된'여름철'이 3년 안에 폐지된 이유
https://www.buzzfeed.com/jp/kotahatachi/summer-time-1948
구체적으로 identifier에서 지정한 경우 일본 이 지역에서 지정한 것이다.
한편, GMT에서 지정한 경우 표준시와의 시간 차이이기 때문에 일본의 정보는 없다.
따라서 여름철 조정은 없을 것 같다.

여름철


여름철의 구체적인 기간에 대해 국립천문대의wiki에서 총괄하였다.
연차
기간
년 (1948)
5/1 12:00 ~ 9/12 0:00
중화 24년 (1949)
4/2 12:00 ~ 9/11 0:00
년 (1950)
5/6 12:00 ~ 9/10 0:00
소화 26년(1951)
5/5 12:00 ~ 9/9 0:00
국립천문대 역법계산실
https://eco.mtk.nao.ac.jp/koyomi/wiki/BBFEB9EF2FB2C6BBFEB9EF.html identifier: "Asia/Tokyo"에서 이 기간을 이용한 경우
여름철로 여겨질 때 한 시간 줄어든다.
(하계 기간이기 때문에 1시간을 추가해야 하는 전제에서 결과는 1시간을 뺀 값이다)
예전에는 2020년 도쿄올림픽을 위해 여름철을 도입하자는 논의가 있었다
실제로 이미 일본에서 채용된 실적이 있고 결국 그만두고 싶다는 의견이 많아 4년이면 끝난다...
왜 또 이걸 채택하고 싶으세요?
어쨌든 일본에는 여름철이 있기 때문이다
TimeZone 지정에 유의해야 한다고 합니다.
특별한 이유가 없다면 TimeZone 초기화 시 GMT 로 통일하는 것이 좋습니다.
이상한 문제로 고민하지 않아도 될지도 몰라요.

이번 실험의 View Controller 코드


ViewController.swift

import UIKit

class ViewController: UIViewController {

    let adjustSecondsForJapan : TimeInterval = 9 * 60 * 60

    @IBOutlet weak var datePicker: UIDatePicker!
    @IBOutlet weak var label: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        setupDatePicker()
    }

    private func setupDatePicker() {
        datePicker.datePickerMode = .date
        datePicker.timeZone = TimeZone(identifier: "Asia/Tokyo")
        datePicker.date = Date(timeIntervalSince1970: -adjustSecondsForJapan)
        datePicker.locale = Locale(identifier: "ja-JP")
    }

    private func getDateStrings(from date: Date) -> String {
        let formatter = DateFormatter()
        formatter.timeZone = TimeZone(secondsFromGMT: Int(adjustSecondsForJapan))
        formatter.dateFormat = "yyyy/MM/dd HH:mm:ss"
        return formatter.string(from: date)

    }

    @IBAction func didChangeDatePicker(_ sender: UIDatePicker) {

        label.text = getDateStrings(from: sender.date)

    }
}

github


becky3/timezone_summertime_test: 일본 여름철 영향 확인 프로젝트
https://github.com/becky3/timezone_summertime_test

좋은 웹페이지 즐겨찾기