ソースを参照

Fix meeting scheduling timezone conversion and display consistency.

Made-with: Cursor
huzaifahayat12 3 ヶ月 前
コミット
49b0140f7f
1 ファイル変更22 行追加11 行削除
  1. 22 11
      zoom_app/ViewController.swift

+ 22 - 11
zoom_app/ViewController.swift

@@ -1070,7 +1070,7 @@ class ViewController: NSViewController {
                 let result = try await createZoomMeeting(
                     accessToken: token,
                     topic: topic,
-                    startTimeWithOffset: draft.startTimeWithOffset,
+                    startTimeUTC: draft.startTimeUTC,
                     durationMinutes: duration,
                     timeZone: tz
                 )
@@ -1157,7 +1157,7 @@ class ViewController: NSViewController {
 
     private struct ScheduleMeetingDraft {
         let startDate: Date
-        let startTimeWithOffset: String
+        let startTimeUTC: String
         let timeZone: TimeZone
     }
 
@@ -1172,19 +1172,21 @@ class ViewController: NSViewController {
         let df = DateFormatter()
         df.locale = Locale(identifier: "en_US_POSIX")
         df.timeZone = tz
-        df.isLenient = true
+        df.calendar = Calendar(identifier: .gregorian)
+        df.isLenient = false
         let formats = ["yyyy-MM-dd h:mm a", "yyyy-MM-dd hh:mm a", "yyyy-MM-dd h:mm:ss a"]
         for format in formats {
             df.dateFormat = format
             if let d = df.date(from: combined) {
-                let localFormatter = DateFormatter()
-                localFormatter.locale = Locale(identifier: "en_US_POSIX")
-                localFormatter.timeZone = tz
-                localFormatter.calendar = Calendar(identifier: .gregorian)
-                localFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssXXXXX"
+                let utcFormatter = DateFormatter()
+                utcFormatter.locale = Locale(identifier: "en_US_POSIX")
+                utcFormatter.timeZone = TimeZone(secondsFromGMT: 0)
+                utcFormatter.calendar = Calendar(identifier: .gregorian)
+                // Send explicit UTC (`Z`) so Zoom receives an unambiguous instant in time.
+                utcFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss'Z'"
                 return ScheduleMeetingDraft(
                     startDate: d,
-                    startTimeWithOffset: localFormatter.string(from: d),
+                    startTimeUTC: utcFormatter.string(from: d),
                     timeZone: tz
                 )
             }
@@ -1896,6 +1898,9 @@ class ViewController: NSViewController {
         dateFormatter.dateFormat = "EEE, MMM d"
         let timeFormatter = DateFormatter()
         timeFormatter.dateFormat = "h:mm a"
+        let displayTimeZone = meeting.meetingTimeZone ?? TimeZone.current
+        dateFormatter.timeZone = displayTimeZone
+        timeFormatter.timeZone = displayTimeZone
         let start = timeFormatter.string(from: meeting.start)
         let end = meeting.end.map { timeFormatter.string(from: $0) }
         let range = end.map { "\(start) - \($0)" } ?? start
@@ -2128,6 +2133,7 @@ class ViewController: NSViewController {
         let title: String
         let start: Date
         let end: Date?
+        let meetingTimeZone: TimeZone?
         let host: String
         let source: String
         let meetingID: String?
@@ -2842,7 +2848,7 @@ class ViewController: NSViewController {
     }
 
     /// Creates a scheduled meeting via [Zoom Create meeting](https://developers.zoom.us/docs/api/rest/reference/zoom-api/methods/#operation/meetingCreate).
-    private func createZoomMeeting(accessToken: String, topic: String, startTimeWithOffset: String, durationMinutes: Int, timeZone: TimeZone) async throws -> ZoomCreateMeetingAPIResult {
+    private func createZoomMeeting(accessToken: String, topic: String, startTimeUTC: String, durationMinutes: Int, timeZone: TimeZone) async throws -> ZoomCreateMeetingAPIResult {
         let url = URL(string: "https://api.zoom.us/v2/users/me/meetings")!
         var request = URLRequest(url: url)
         request.httpMethod = "POST"
@@ -2852,7 +2858,7 @@ class ViewController: NSViewController {
         let body = ZoomCreateMeetingBody(
             topic: topic,
             type: 2,
-            start_time: startTimeWithOffset,
+            start_time: startTimeUTC,
             duration: durationMinutes,
             timezone: timeZone.identifier
         )
@@ -2882,6 +2888,7 @@ class ViewController: NSViewController {
             let id: Int?
             let topic: String?
             let start_time: String?
+            let timezone: String?
             let duration: Int?
             let host_id: String?
             let type: Int?
@@ -2941,6 +2948,7 @@ class ViewController: NSViewController {
                     title: meeting.topic?.isEmpty == false ? meeting.topic! : "Zoom meeting",
                     start: start,
                     end: end,
+                    meetingTimeZone: meeting.timezone.flatMap { TimeZone(identifier: $0) },
                     host: meeting.host_id ?? "Zoom Host",
                     source: "Zoom",
                     meetingID: meeting.id.map(String.init),
@@ -5622,6 +5630,9 @@ class ViewController: NSViewController {
         dateFormatter.dateFormat = "EEE, MMM d"
         let timeFormatter = DateFormatter()
         timeFormatter.dateFormat = "h:mm a"
+        let displayTimeZone = meeting.meetingTimeZone ?? TimeZone.current
+        dateFormatter.timeZone = displayTimeZone
+        timeFormatter.timeZone = displayTimeZone
         let startText = timeFormatter.string(from: meeting.start)
         let endText = meeting.end.map { timeFormatter.string(from: $0) } ?? ""
         let range = endText.isEmpty ? startText : "\(startText) - \(endText)"