Created
August 23, 2022 10:01
-
-
Save KatharinaGopp/7dac4c660860b9b4130631c032bb8268 to your computer and use it in GitHub Desktop.
Timezone Shenanigans
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Foundation | |
let date1 = Date(timeIntervalSince1970: 0) // 1970-01-01 00:00:00 | |
let date2 = Date(timeIntervalSince1970: 60 * 60 * 24)// 1970-01-02 00:00:00 | |
func compareDates(date1: Date, date2: Date){ | |
switch date1 { | |
case date2: | |
print("date1 and date2 represent the same point in time") | |
case ...date2: | |
print("date1 is earlier in time than date2") | |
case date2...: | |
print("date1 is later in time than date2") | |
default: | |
return | |
} | |
} | |
compareDates(date1: date1, date2: date2) | |
func startOfDayIn(date: Date, timeZone: TimeZone) -> Date { | |
var calendar = Calendar.current | |
calendar.timeZone = timeZone | |
return calendar.startOfDay(for: date) | |
} | |
let date = Date(timeIntervalSince1970: 60 * 60 * 24 * 365) // 1971-01-01 00:00:00 | |
let timeZone1 = TimeZone(secondsFromGMT: 60 * 60 * 1)! // Berlin | |
let start1 = startOfDayIn(date: date, timeZone: timeZone1) | |
let timeZone2 = TimeZone(secondsFromGMT: 60 * 60 * -8)! // New York City | |
let start2 = startOfDayIn(date: date, timeZone: timeZone2) | |
compareDates(date1: start1, date2: start2) | |
(-12...12).reversed().forEach { deviation in | |
let timeZone = TimeZone(secondsFromGMT: 60 * 60 * deviation)! | |
let start = startOfDayIn(date: date, timeZone: timeZone) | |
print(start, "| UTC\(deviation >= 0 ? "+" : "")\(deviation)") | |
} | |
func adjustedStartOfDayIn(date: Date, timeZone: TimeZone) -> Date { | |
var calendar = Calendar.current | |
calendar.timeZone = timeZone | |
let correctDay = date.addingTimeInterval(TimeInterval(-timeZone.secondsFromGMT())) | |
return calendar.startOfDay(for: correctDay) | |
} | |
let correctStart1 = adjustedStartOfDayIn(date: date, timeZone: timeZone1) | |
let correctStart2 = adjustedStartOfDayIn(date: date, timeZone: timeZone2) | |
compareDates(date1: correctStart1, date2: correctStart2) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment