git.iko.soy/dashared/hookah-tau
on develop help sign in
dashared/hookah-tau/Hookah Tau/Extensions+Date.swift
237 lines 7.9 kB history raw
1//
2// Extensions+Date.swift
3// Hookah Tau
4//
5// Created by cstore on 16/11/2019.
6// Copyright © 2019 Daria Rednikina. All rights reserved.
7//
9import Foundation
11struct IntervalDate {
12 var day: Int
13 var month: Int
14 var year: Int
16 var minutes: Int? = nil
19extension DateFormatter {
20 static let iso8601Full: DateFormatter = {
21 let formatter = DateFormatter()
22 formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss'Z'"
23 formatter.timeZone = TimeZone(abbreviation: "UTC")
24 return formatter
25 }()
27 static let dmy: DateFormatter = {
28 let formatter = DateFormatter()
29 formatter.dateFormat = "yyyy-MM-dd"
30 formatter.timeZone = TimeZone(abbreviation: "UTC")
31 return formatter
32 }()
36extension Date {
37 static func getNext(days: Int) -> [Date] {
38 var result = [Date]()
40 var date = Date()
41 let calendar = Calendar.current
43 for _ in 1...days {
44 result.append(date)
46 let newDate = calendar.date(byAdding: .day, value: 1, to: date)
47 guard let nextDate = newDate else { break }
48 date = nextDate
49 }
51 return result
52 }
54 static func getDateFromCurrent(days: Int = 0, periods: Int? = nil) -> Date? {
55 let date = Date()
57 let utcDate = date.getUTCDate()
59 let newDate = Calendar.current.date(byAdding: .day, value: days, to: utcDate)
61 // case if periods are important
62 if let minutes = periods, let date = newDate {
63 return date.changeTime(periods: minutes)
64 }
66 return newDate
67 }
69 /// Get UTC format of date
70 func getUTCDate() -> Date {
71 let calendar = Calendar.current
73 let day = calendar.dateComponents([.year, .month, .day, .hour, .minute], from: self)
75 var dateCalendars = DateComponents()
76 dateCalendars.hour = day.hour!
77 dateCalendars.minute = day.minute!
78 dateCalendars.day = day.day!
79 dateCalendars.month = day.month!
80 dateCalendars.year = day.year!
81 dateCalendars.timeZone = TimeZone(abbreviation: "GMT")
83 return Calendar.current.date(from: dateCalendars)!
84 }
86 func changeTime(periods: Int) -> Date? {
87 let hours = (periods * 10 / 60) % 24
88 let min = (periods * 10) % 60
90 return self.set(hours: hours, minutes: min, seconds: 0)
91 }
93 func getDay() -> Int {
94 let day = Calendar.current.dateComponents([.day], from: self)
95 return day.day ?? 0
96 }
98 func getDMY() -> Date {
99 return set(hours: 0, minutes: 0, seconds: 0)!
100 }
102 func addHours(_ h: Int) -> Date {
103 return self.addingTimeInterval(Double(h) * 60.0 * 60.0)
104 }
106 func addPeriods(_ p: Int) -> Date {
107 let h = (p * 10 / 60) % 24
108 let m = (p * 10) % 60
110 return self.addingTimeInterval(Double(h) * 60.0 * 60.0 + Double(m) * 60.0)
111 }
113 func set(hours: Int, minutes: Int, seconds: Int) -> Date? {
115 let dateFormatter = DateFormatter()
116 dateFormatter.calendar = Calendar.current
117 dateFormatter.timeZone = TimeZone(abbreviation: "UTC")
118 dateFormatter.dateFormat = "yyyy-MM-dd"
120 let newDateString = "\(dateFormatter.string(from: self)) \(hours):\(minutes):\(seconds)"
122 dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
124 return dateFormatter.date(from: newDateString)
125 }
127 func getMinutesPeriods(fromStart startDate: Date) -> Int {
128 let diffInMins = Calendar.current.dateComponents([.minute], from: startDate, to: self).minute!
129 let periods = diffInMins / 10
130 return periods
131 }
133 func getPrevCurrentNextMonth() -> (String, String, String) {
134 let dateFormatter = DateFormatter()
135 dateFormatter.timeZone = TimeZone(abbreviation: "UTC")
136 dateFormatter.dateFormat = "LLLL"
137 let current = dateFormatter.string(from: self)
139 let nextDate = Calendar.current.date(byAdding: .month, value: 1, to: self)!
140 let next = dateFormatter.string(from: nextDate)
142 let prevDate = Calendar.current.date(byAdding: .month, value: -1, to: self)!
143 let prev = dateFormatter.string(from: prevDate)
145 print("\(prevDate) \(self) \(nextDate)")
146 return (prev, current, next)
147 }
150// MARK: - Admin vs Client
152extension Date {
154 /// Идем на день назад, чтобы найти точку начала с которой может забронировать администратор
155 func getAdminStartingAndEndPoint() -> (Date, Date) {
156 let utcDate = self.getUTCDate()
158 let startDate = Calendar.current.date(byAdding: .day, value: -1, to: utcDate)!
159 let endDate = Calendar.current.date(byAdding: .day, value: 1, to: utcDate)!
161 return (startDate, endDate)
162 }
164 func getAdminsStartingPoint() -> Int {
165 var calendar = Calendar.current
166 calendar.timeZone = TimeZone(abbreviation: "UTC")!
168 let comp = calendar.dateComponents([.hour, .minute], from: self)
169 return (comp.hour! * 6 + comp.minute! / 10)
170 }
172 func getClientStartingAndEndPoint() -> (Date, Date) {
173 // час
174 var calendar = Calendar.current
175 calendar.timeZone = TimeZone(abbreviation: "UTC")!
177 let hour = calendar.dateComponents([.hour], from: self).hour!
179 if hour >= 0 && hour <= 3 { // [ 00:00 ... 3:00 ]
180 let endDate = self.set(hours: 3, minutes: 0, seconds: 0)! // 3 00
181 let start = calendar.date(byAdding: .day, value: -1, to: self)!
182 let startDate = start.set(hours: 12, minutes: 0, seconds: 0)! // 12 00
184 return (startDate, endDate)
185 } else { // [12:00 ... 23:50]
186 let startDate = self.set(hours: 12, minutes: 0, seconds: 0)! // 12 00
187 let end = calendar.date(byAdding: .day, value: 1, to: self)!
188 let endDate = end.set(hours: 3, minutes: 0, seconds: 0)! // 3 00
190 return (startDate, endDate)
191 }
192 }
194 /// Определяем попадает ли в промежуток между [3:00, 12:00)
195 func isInClosingHours() -> Bool {
196 var calendar = Calendar.current
197 calendar.timeZone = TimeZone(abbreviation: "UTC")!
199 let day = calendar.dateComponents([.hour, .day, .month, .year, .minute], from: self)
201 var dateCalendars = DateComponents()
202 dateCalendars.hour = 3
203 dateCalendars.minute = 0
204 dateCalendars.day = day.day!
205 dateCalendars.month = day.month!
206 dateCalendars.year = day.year!
207 dateCalendars.timeZone = TimeZone(abbreviation: "GMT")
209 let startClosing = calendar.date(from: dateCalendars)!
211 dateCalendars.hour = 11
212 dateCalendars.minute = 50
214 let endClosing = calendar.date(from: dateCalendars)!
216 let intervalClosing = DateInterval(start: startClosing, end: endClosing)
218 return intervalClosing.contains(self)
219 }
222extension Date {
223 static func format(_ startDate: Date, _ endDate: Date) -> (date: String, time: String) {
224 let dateFormatter = DateFormatter()
225 dateFormatter.calendar = Calendar.current
226 dateFormatter.timeZone = TimeZone(abbreviation: "UTC")
227 dateFormatter.dateFormat = "d MMMM"
228 dateFormatter.locale = Locale(identifier: "ru_RU")
230 let dateStr = "\(dateFormatter.string(from: startDate))"
232 dateFormatter.dateFormat = "HH:mm"
233 let timeStr = "\(dateFormatter.string(from: startDate)) — \(dateFormatter.string(from: endDate))"
235 return (dateStr, timeStr)
236 }