Skip to content

Commit baa0954

Browse files
committed
Convert selected dates to UTC
1 parent 4caeca3 commit baa0954

File tree

3 files changed

+29
-6
lines changed

3 files changed

+29
-6
lines changed

Modules/Sources/Yosemite/Tools/Bookings/ResultsController+FilterBookings.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import CoreData
2-
import Storage
32

43
extension NSPredicate {
54
public static func createBookingPredicate(siteID: Int64, filters: BookingFilters) -> NSPredicate {
@@ -23,7 +22,8 @@ extension NSPredicate {
2322

2423
let bookingStatusesPredicate = filters.bookingStatuses.isNotEmpty ? NSPredicate(format: "statusKey IN %@", filters.bookingStatuses) : nil
2524

26-
let attendanceStatusesPredicate = filters.attendanceStatuses.isNotEmpty ? NSPredicate(format: "attendanceStatusKey IN %@", filters.attendanceStatuses) : nil
25+
let attendanceStatusesPredicate = filters.attendanceStatuses.isNotEmpty ?
26+
NSPredicate(format: "attendanceStatusKey IN %@", filters.attendanceStatuses) : nil
2727

2828
let subpredicates = [
2929
siteIDPredicate,

WooCommerce/Classes/Bookings/BookingFilters/BookingDateTimeFilterView.swift

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,22 @@ struct BookingDateTimeFilterView: View {
6363
selectedToDate = newValue
6464
}
6565
.onChange(of: selectedFromDate) { _, newValue in
66-
onSelection(newValue, selectedToDate)
66+
guard let newValue else {
67+
return onSelection(nil, selectedToDate)
68+
}
69+
/// Bookings backend treats dates as local time with no time zone.
70+
/// Convert the date to keep the selected components but with UTC as time zone.
71+
let convertedDate = convertToUTCDate(newValue)
72+
onSelection(convertedDate, selectedToDate)
6773
}
6874
.onChange(of: selectedToDate) { _, newValue in
69-
onSelection(selectedFromDate, newValue)
75+
guard let newValue else {
76+
return onSelection(selectedFromDate, nil)
77+
}
78+
/// Bookings backend treats dates as local time with no time zone.
79+
/// Convert the date to keep the selected components but with UTC as time zone.
80+
let convertedDate = convertToUTCDate(newValue)
81+
onSelection(selectedFromDate, convertedDate)
7082
}
7183
}
7284
}
@@ -156,6 +168,19 @@ private extension BookingDateTimeFilterView {
156168
return fromDate...Date.distantFuture
157169
}
158170
}
171+
172+
/// Converts a date by extracting its components in the local timezone
173+
/// and reconstructing a new date with those same components in UTC.
174+
/// This effectively treats the selected date/time as if it were in UTC.
175+
func convertToUTCDate(_ date: Date) -> Date {
176+
let localCalendar = Calendar.current
177+
let components = localCalendar.dateComponents([.year, .month, .day, .hour, .minute, .second], from: date)
178+
179+
var utcCalendar = Calendar(identifier: .gregorian)
180+
utcCalendar.timeZone = TimeZone(identifier: "UTC")!
181+
182+
return utcCalendar.date(from: components) ?? date
183+
}
159184
}
160185

161186
private extension BookingDateTimeFilterView {

WooCommerce/Classes/Bookings/BookingList/BookingListViewModel.swift

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ final class BookingListViewModel: ObservableObject {
2626
private let type: BookingListTab
2727
private let stores: StoresManager
2828
private let storage: StorageManagerType
29-
private let currentDate: Date
3029
private var currentOrder: SortBy = .newestToOldest
3130

3231
private var filters: BookingFilters
@@ -66,7 +65,6 @@ final class BookingListViewModel: ObservableObject {
6665
self.type = type
6766
self.stores = stores
6867
self.storage = storage
69-
self.currentDate = currentDate
7068
self.paginationTracker = PaginationTracker(pageFirstIndex: pageFirstIndex)
7169

7270
self.filters = {

0 commit comments

Comments
 (0)