|
|
@@ -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)"
|