summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorivar <i@oiee.no>2026-03-23 16:01:57 +0100
committerivar <i@oiee.no>2026-03-23 16:01:57 +0100
commit141e76fb5b9da799988a61a3f62d2523d63e6e35 (patch)
treefd9f01f828fe1a58365667c7554d593db50f8bda
parent2ddeecbc8cee23bb8bcbb32554c3eff05a43e098 (diff)
downloadsolverv-141e76fb5b9da799988a61a3f62d2523d63e6e35.tar.xz
solverv-141e76fb5b9da799988a61a3f62d2523d63e6e35.zip
feat: add SolsticeEvent model with UTC-to-local conversion
-rw-r--r--Solverv/Models/SolsticeEvent.swift38
1 files changed, 38 insertions, 0 deletions
diff --git a/Solverv/Models/SolsticeEvent.swift b/Solverv/Models/SolsticeEvent.swift
new file mode 100644
index 0000000..46c14ac
--- /dev/null
+++ b/Solverv/Models/SolsticeEvent.swift
@@ -0,0 +1,38 @@
+import Foundation
+
+struct SolsticeEvent: Identifiable, Codable {
+ let id: UUID
+ let name: String
+ let date: Date // UTC
+ let season: Season
+
+ init(name: String, date: Date, season: Season) {
+ self.id = UUID()
+ self.name = name
+ self.date = date
+ self.season = season
+ }
+
+ /// Convert UTC date to user's local timezone
+ func localDateTime() -> Date {
+ let utcCalendar = Calendar(identifier: .gregorian)
+ var utcComponents = utcCalendar.dateComponents([.year, .month, .day, .hour, .minute, .second], from: date)
+ let timeZone = TimeZone.current
+ let offset = timeZone.secondsFromGMT(for: date)
+
+ var localCalendar = Calendar.current
+ localCalendar.timeZone = timeZone
+ var localComponents = utcComponents
+ localComponents.second = (localComponents.second ?? 0) + offset
+
+ return localCalendar.date(from: localComponents) ?? date
+ }
+
+ /// Days until this event from today
+ func daysUntil() -> Int {
+ let today = Calendar.current.startOfDay(for: Date())
+ let eventDay = Calendar.current.startOfDay(for: date)
+ let components = Calendar.current.dateComponents([.day], from: today, to: eventDay)
+ return max(0, components.day ?? 0)
+ }
+}