81 lines
2.4 KiB
Swift
81 lines
2.4 KiB
Swift
//
|
||
// Date+Extensions.swift
|
||
// Schedule ICTIS
|
||
//
|
||
// Created by Mironov Egor on 14.11.2024.
|
||
//
|
||
|
||
import SwiftUI
|
||
|
||
|
||
extension Date {
|
||
func format(_ format: String, locale: Locale = Locale(identifier: "ru_RU")) -> String {
|
||
let formatter = DateFormatter()
|
||
formatter.dateFormat = format
|
||
formatter.locale = locale
|
||
let formattedString = formatter.string(from: self)
|
||
|
||
if format == "EEEE" {
|
||
return formattedString.prefix(1).capitalized + formattedString.dropFirst()
|
||
}
|
||
|
||
return formattedString
|
||
}
|
||
|
||
var isToday: Bool {
|
||
return Calendar.current.isDateInToday(self)
|
||
}
|
||
|
||
private func isSameDate(_ date1: Date?, _ date2: Date?) -> Bool {
|
||
guard let date1 = date1, let date2 = date2 else { return false }
|
||
let calendar = Calendar.current
|
||
return calendar.isDate(date1, inSameDayAs: date2)
|
||
}
|
||
|
||
func fetchWeek(_ date: Date = .init()) -> [WeekDay] {
|
||
let calendar = Calendar.current
|
||
let startOfDate = calendar.startOfDay(for: date)
|
||
|
||
var week: [WeekDay] = []
|
||
let weekForDate = calendar.dateInterval(of: .weekOfMonth, for: startOfDate)
|
||
//print("Start: \(weekForDate?.start)")
|
||
//print("End: \(weekForDate?.end)")
|
||
|
||
guard let startOfWeek = weekForDate?.start else {
|
||
return []
|
||
}
|
||
|
||
// Создаем дни для недели
|
||
(0..<7).forEach { index in
|
||
if let weekDay = calendar.date(byAdding: .day, value: index, to: startOfWeek) {
|
||
week.append(WeekDay(date: weekDay))
|
||
}
|
||
}
|
||
|
||
return week
|
||
}
|
||
|
||
func createNextWeek() -> [WeekDay] {
|
||
let calendar = Calendar.current
|
||
let startOfLastDate = calendar.startOfDay(for: self)
|
||
guard let nextDate = calendar.date(byAdding: .day, value: 1, to: startOfLastDate) else {
|
||
return []
|
||
}
|
||
return fetchWeek(nextDate)
|
||
}
|
||
|
||
func createPrevioustWeek() -> [WeekDay] {
|
||
let calendar = Calendar.current
|
||
let startOfFirstDate = calendar.startOfDay(for: self)
|
||
guard let previousDate = calendar.date(byAdding: .day, value: -1, to: startOfFirstDate) else {
|
||
return []
|
||
}
|
||
return fetchWeek(previousDate)
|
||
}
|
||
|
||
struct WeekDay: Identifiable {
|
||
var id: UUID = .init()
|
||
var date: Date
|
||
}
|
||
}
|