Files
Reflect/Shared/Date+Extensions.swift
Trey t 0442eab1f8 Rebrand entire project from Feels to Reflect
Complete rename across all bundle IDs, App Groups, CloudKit containers,
StoreKit product IDs, data store filenames, URL schemes, logger subsystems,
Swift identifiers, user-facing strings (7 languages), file names, directory
names, Xcode project, schemes, assets, and documentation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 11:47:16 -06:00

104 lines
3.3 KiB
Swift

//
// Date+Extensions.swift
// Reflect (iOS)
//
// Created by Trey Tartt on 2/19/22.
//
import Foundation
extension Date: @retroactive RawRepresentable {
public var rawValue: String {
self.timeIntervalSinceReferenceDate.description
}
public init?(rawValue: String) {
self = Date(timeIntervalSinceReferenceDate: Double(rawValue) ?? 0.0)
}
var startOfDay: Date {
return Calendar.current.startOfDay(for: self)
}
var startOfMonth: Date {
let calendar = Calendar(identifier: .gregorian)
let components = calendar.dateComponents([.year, .month], from: self)
return calendar.date(from: components)!
}
var endOfDay: Date {
var components = DateComponents()
components.day = 1
components.second = -1
return Calendar.current.date(byAdding: components, to: startOfDay)!
}
var endOfMonth: Date {
var components = DateComponents()
components.month = 1
components.second = -1
return Calendar(identifier: .gregorian).date(byAdding: components, to: startOfMonth)!
}
func toLocalTime() -> Date {
let timezone = TimeZone.current
let seconds = TimeInterval(timezone.secondsFromGMT(for: self))
return Date(timeInterval: seconds, since: self)
}
var weekday: Int {
Calendar.current.component(.weekday, from: self)
}
var firstDayOfTheMonth: Date {
Calendar.current.dateComponents([.calendar, .year,.month], from: self).date!
}
static public func dates(from fromDate: Date, toDate: Date, includingToDate: Bool = false) -> [Date] {
var dates: [Date] = []
var date = Calendar.current.date(bySettingHour: 0, minute: 0, second: 0, of: fromDate)!
let toDate = Calendar.current.date(bySettingHour: 0, minute: 0, second: 0, of: toDate)!
if includingToDate {
while date <= toDate {
dates.append(date)
guard let newDate = Calendar.current.date(byAdding: .day, value: 1, to: date) else { break }
date = newDate
}
} else {
while date < toDate {
dates.append(date)
guard let newDate = Calendar.current.date(byAdding: .day, value: 1, to: date) else { break }
date = newDate
}
}
return dates
}
static func dateRange(monthInt: Int, yearInt: Int) -> (startDate: Date, endDate: Date) {
var dateComponents = DateComponents()
dateComponents.year = yearInt
dateComponents.month = monthInt
dateComponents.day = 3
dateComponents.hour = 12
var userCalendar = Calendar(identifier: .gregorian)
userCalendar.timeZone = TimeZone(secondsFromGMT: 0)!
let someDateTime = userCalendar.date(from: dateComponents)!
let startDate = someDateTime.startOfMonth
var endDate = someDateTime.endOfMonth
endDate = Calendar.current.date(byAdding: .hour, value: -8, to: endDate)!
return (startDate, endDate)
}
func formattedDate() -> String {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "MMM dd, yyyy"
return dateFormatter.string(from: self)
}
}