2// Extensions+Date.swift
5// Created by cstore on 16/11/2019.
6// Copyright © 2019 Daria Rednikina. All rights reserved.
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")
27 static let dmy: DateFormatter = {
28 let formatter = DateFormatter()
29 formatter.dateFormat = "yyyy-MM-dd"
30 formatter.timeZone = TimeZone(abbreviation: "UTC")
37 static func getNext(days: Int) -> [Date] {
41 let calendar = Calendar.current
46 let newDate = calendar.date(byAdding: .day, value: 1, to: date)
47 guard let nextDate = newDate else { break }
54 static func getDateFromCurrent(days: Int = 0, periods: Int? = nil) -> 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)
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)!
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)
93 func getDay() -> Int {
94 let day = Calendar.current.dateComponents([.day], from: self)
98 func getDMY() -> Date {
99 return set(hours: 0, minutes: 0, seconds: 0)!
102 func addHours(_ h: Int) -> Date {
103 return self.addingTimeInterval(Double(h) * 60.0 * 60.0)
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)
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)
127 func getMinutesPeriods(fromStart startDate: Date) -> Int {
128 let diffInMins = Calendar.current.dateComponents([.minute], from: startDate, to: self).minute!
129 let periods = diffInMins / 10
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)
150// MARK: - Admin vs Client
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)
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)
172 func getClientStartingAndEndPoint() -> (Date, Date) {
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)
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)
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)
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list