Инструментарий для парсинга, валидации, манипулирования, сравнения и отображения дат, времени и часовых поясов на языке Swift.
SwiftDate — это набор инструментов для манипулирования и отображения дат и времени в различных платформах Apple, а также на Linux и серверных фреймворках на Swift, таких как Vapor или Kitura.
Более трёх миллионов загрузок на CocoaPods.
От простой манипуляции с датами до сложной бизнес-логики SwiftDate может стать правильным выбором для вашего следующего проекта.- [x] Простой парсинг дат (персонализированные форматы, ISO8601, RSS и многое другое)
Простое форматирование дат даже с использованием разговорного формата и более чем 140 поддерживаемых языков
Математические операции со временем (2 часа + 5 минут
)
Интуитивное извлечение компонентов (день, час, ближайший час, короткое имя дня недели
)
Генерация производных дат (следующая неделя, следующий месяц, следующий день недели, завтра
)
Более чем 20 функций детального сравнения дат (является сегодня, является завтра, является одной неделей, является следующим годом
)
Поддержка Codable в Swift 4
Генерация случайных дат
Функции детального перечисления дат
Поддержка временных периодов
Конвертация TimeInterval в другие единицы (2 часа.toUnits(.минуты)
)и конечно же...
ЭТО ТЕСТИРОВАНО! Проект имеет 90%-ю покрытие кода тестами (хотите помочь нам? Напишите несколько юнит-тестов и сделайте pull request)
ЭТО ПОЛНОСТЬЮ ДОКУМЕНТИРОВАНО!, включая полное руководство и Jazzy!
НАМ ЛЮБИМО ИСПОЛЬЗОВАТЬ PLAYGROUNDS! Проверьте наш интерактивный playground!
Целая библиотека полностью документирована как через инспектор методов в Xcode, так и через полное руководство на языке Markdown, которое вы можете найти ниже.
От простого манипулирования датами до сложной бизнес-логики SwiftDate может стать правильным выбором для вашего следующего проекта.
Давайте рассмотрим основные возможности библиотеки:
SwiftDate может автоматически распознавать все основные форматы представления даты и времени (ISO8601, RSS, Alt RSS, .NET, SQL, HTTP...), а также вы можете предоставить свои собственные форматы. Создание новой даты никогда ещё не было таким простым!
// Все основные форматы представления даты и времени (более 15) распознаются автоматически
let _ = "2010-05-20 15:30:00".toDate()
// Вы также можете предоставить свои собственные форматы!
let _ = "2010-05-20 15:30".toDate("yyyy-MM-dd HH:mm")
// Поддерживаются все варианты ISO8601 вместе с парсингом часовых поясов!
let _ = "2017-09-17T11:59:29+02:00".toISODate()
// RSS, Расширенный, HTTP, SQL, .NET и все основные варианты поддерживаются!
let _ = "19 Nov 2015 22:20:40 +0100".toRSS(alt: true)
Дата может быть манипулирована путём добавления или удаления временных компонентов с использованием естественного языка; извлечение единиц измерения времени также легко и включает поддержку часовых поясов, календарей и локалей!
Манипуляция может выполняться с помощью стандартных математических операторов и между датами, временными интервалами, компонентами даты и соответствующими единицами измерения времени!```swift // Support for using units of time measurement let _ = ("2010-05-20 15:30:00".toDate() + 3.months - 2.days) let _ = Date() + 3.hours let _ = date1 + [.year:1, .month:2, .hour:5] let _ = date1 + date2 // Extraction of individual components of time measurement units from date manipulations let over1Year = (date3 - date2).year > 1
<a name="3"/>### 3. Сравнение дат
SwiftDate включает полный набор сравнительных функций; вы можете сравнивать две даты по гранулярности, проверять является ли дата определённым днём, диапазоном и практически любым другим сравнением, которое вам когда-либо потребовалось.
Сравнение также доступно через стандартные математические операторы как (`>, >=, <, <=`).
```swift
// Разрешено стандартное математическое сравнение
let _ = dateA >= dateB || dateC < dateB
```// Сложные сравнения включают поддержку детализации
let _ = dateA.compare(toDate: dateB, granularity: .час) == .orderedSame
let _ = dateA.isAfterDate(dateB, orEqual: true, granularity: .месяц) // больше или равно до месячной гранулярности
let _ = dateC.isInRange(date: dateA, and: dateB, orEqual: true, granularity: .день) // больше или равно до дневной гранулярности
let _ = dateA.earlierDate(dateB) // более ранняя дата
let _ = dateA.laterDate(dateB) // более поздняя дата// Проверка близости одной даты к другой с заданной точностью
let _ = dateA.compareCloseTo(dateB, precision: 1.hours.timeInterval)
// Сравнение для значимых событий:
// .isToday, .isYesterday, .isTomorrow, .isWeekend, .isNextWeek
// .isSameDay, .isMorning, .isWeekday ...
let _ = date.compare(.isToday)
let _ = date.compare(.isNight)
let _ = date.compare(.isNextWeek)
let _ = date.compare(.isThisMonth)
let _ = date.compare(.startOfWeek)
let _ = date.compare(.isNextYear)
// ...и БОЛЕЕ 30 ДРУГИХ ВКЛЮЧЕННЫХ СРАВНЕНИЙ
// Операции в массивах (oldestIn, newestIn, sortedByNewest, sortedByOldest...)
let _ = DateInRegion.oldestIn(list: datesArray)
let _ = DateInRegion.sortedByNewest(list: datesArray)
<a name="4"/>### 4. Создание дат с учетом региона (часового пояса, календаря и локали)
Вы можете создать новые даты из строки, временного интервала или используя компоненты даты. SwiftDate предлагает широкий набор функций для создания и производных дат даже с использованием случайного генератора!```swift
// Все даты включают часовой пояс, календарь и локаль!
// Создание из строки
let rome = Region(calendar: Calendars.gregorian, zone: Zones.europeRome, locale: Locales.italian)
let date1 = DateInRegion("2010-01-01 00:00:00", region: rome)!
// Создание даты из временных интервалов
let _ = DateInRegion(seconds: 39940, region: rome)
let _ = DateInRegion(milliseconds: 5000, region: rome)
// Создание даты из компонентов
let _ = DateInRegion(components: {
$0.year = 2001
$0.month = 9
$0.day = 11
$0.hour = 12
$0.minute = 0
}, region: rome)
let _ = DateInRegion(year: 2001, month: 1, day: 5, hour: 23, minute: 30, second: 0, region: rome)
// Генерация случайной даты с/без границ
let _ = DateInRegion.randomDate(region: rome)
let _ = DateInRegion.randomDate(withinDaysBeforeToday: 5)
let _ = DateInRegion.randomDates(count: 50, between: lowerLimitDate, and: upperLimitDate, region: rome)
Дата также может быть сгенерирована на основе других дат; SwiftDate включает обширный набор функций для генерации.
Более чем 20 различных производных дат можно легко создать с помощью функции dateAt()
.
``````swift
let _ = DateInRegion().dateAt(.endOfDay) // сегодня в конце дня
// Больше чем 20 различных значимых дат, включая .startOfDay,
// .endOfDay, .startOfWeek, .tomorrow, .nextWeekday, .nextMonth, .prevYear, .nearestMinute и многие другие!
let _ = dateA.nextWeekday(.friday) // следующий пятница после dateA
let _ = (date.dateAt(.startOfMonth) - 3.days)
let _ = dateA.compare(.endOfWeek)
``````swift
// Перечисление дат в диапазоне путём предоставления собственного
// шага, выразив его через компоненты даты
let от = DateInRegion("2015-01-01 10:00:00", region: rome)!
let до = DateInRegion("2015-01-02 03:00:00", region: rome)!
let шаг2 = DateComponents.create {
$0.hour = 1
$0.minute = 30
$0.second = 10
}
// Генерация дат в диапазоне с шагом +1ч,30м,10с каждую новую дату
let даты = DateInRegion.enumerateDates(from: от, to: до, increment: шаг2)
```// Получение всех понедельников в январе 2019 года
let понедельникиВянвареДвухтысячдевятнадцатого = Date.datesForWeekday(.понедельник, вМесяце: 1, годДвухтысячдевятнадцатого: 2019)
// Изменение временных компонентов
let _ = dateA.dateBySet(hour: 10, minute: 0, second: 0)
// Обрезка даты
let _ = dateA.dateTruncated(at: [.год,.месяц,.день]) // сброс всех временных компонентов, оставив только дату
// Округление даты
let _ = dateA.dateRoundedAt(.доMinutes(10))
let _ = dateA.dateRoundedAt(.доПолуЧаса30)
// Добавление компонентов
let _ = dateA.dateByAdding(5,.год)
// Дата начала/конца любого временного компонента
let _ = dateA.dateAtEndOf(.год) // 31 декабря в 23:59:59
let _ = dateA.dateAtStartOf(.день) // в 00:00:00 того же дня
let _ = dateA.dateAtStartOf(.месяц) // в 00:00:00 первого дня месяца
Вы можете извлекать компоненты непосредственно из дат и это включает правильное значение, выраженное в регионе даты (правильное часовое пояс и установленный локаль!).
// Создание даты в регионе, Лондон, но с локалью, установленной на Италию
let лондон = Region(calendar: .gregorian, zone: .europeLondon, locale: .italian)
let дата = DateInRegion("2018-02-05 23:14:45", format: dateFormat, region: лондон)!
// Вы можете извлечь любой из доступных временных единиц.
// ЗНАЧЕНИЯ ВЫРАЖЕНЫ В РЕГИОНЕ ДАТЫ (ПРАВИЛЬНОЕ ЧАСОВОЕ ПОЯС).
// (вы всё ещё можете получить UTC/абсолютное значение, получив absoluteDate внутри).
```let _ = дата.год // 2018
let _ = дата.месяц // 2
let _ = дата.имяМесяцаПоУмолчанию // 'февраля', так как локаль установлена на итальянский язык!
let _ = дата.первыйДеньНедели // 5
let _ = дата.короткоеИмяДняНедели // 'пн.' так как локаль установлена на итальянский язык
// ... все компоненты поддерживаются: .год, .месяц, .день, .час, .минута, .секунда,
// .имяМесяца, .деньНедели, .ближайшийЧас, .первыйДеньНедели, .квартал и так далее...
```<a name="7"/>
### 7. Переключение между часовым поясом/локалью и календарями
Вы легко можете конвертировать любую дату в другой регион (также известный как другой календарь, локаль или часовой пояс)! Новая дата содержит все значения, выраженные в целевом регионе.
```swift
// Преобразование между часовыми поясами легко с помощью функции convertTo(region:)
let rNY = Region(calendar: Calendars.gregorian, zone: Zones.americaNewYork, locale: Locales.english)
let rRome = Region(calendar: Calendars.gregorian, zone: Zones.europeRome, locale: Locales.italian)
let dateInNY = "2017-01-01 00:00:00".toDate(region: rNY)
let dateInRome = dateInNY?.convertTo(region: rRome)!
print(dateInRome.toString()) // "dom gen 01 06:00:00 +0100 2017\n"
// Вы также можете конвертировать отдельные атрибуты региона
let dateInIndia = dateInNY?.convertTo(timezone: Zones.indianChristmas, locale: Locales.nepaliIndia)
print("\(dateInIndia!.toString())") // "आइत जनवरी ०१ १२:००:०० +0700 २०१७\n"
Форматирование даты простое, вы можете указать свой собственный формат, локаль или использовать любую из предоставленных.
// Форматирование даты
let london = Region(calendar: .gregorian, zone: .europeLondon, locale: .english)
let date = ... // 2017-07-22T18:27:02+02:00 в регионе London
let _ = date.toDotNET() // /Date(1500740822000+0200)/
let _ = date.toISODate() // 2017-07-22T18:27:02+02:00
let _ = date.toFormat("dd MMM yyyy 'at' HH:mm:ss") // "22 июль 2017 года в 18:27:02"
// Вы также можете легко менять локаль при форматировании региона
let _ = date.toFormat("dd MMM", locale: .italian) // "22 luglio"
// Форматирование временного интервала как обратного отсчета
let interval: TimeInterval = (2.hours.timeInterval) + (34.minutes.timeInterval) + (5.seconds.timeInterval)
let _ = interval.toClock() // "2:34:05"
```// Форматирование временного интервала по компонентам
let _ = interval.toString {
$0.maximumUnitCount = 4
$0.allowedUnits = [.day, .hour, .minute]
$0.collapsesLargestUnit = true
$0.unitsStyle = .abbreviated
} // "2ч 34м"
Относительное форматирование полностью ново в SwiftDate; оно поддерживает более 120 языков с двумя различными стилями (.default
, .twitter
), девятью вариантами (.long
, .longTime
, .longConvenient
, .short
, .shortTime
, .shortConvenient
, .narrow
, .tiny
, .quantify
) и все они настраиваемы так, как вам нужно.
Расширяемый формат позволяет вам предоставлять свои собственные переводы и правила для переопределения поведения по умолчанию.
// Стиль Twitter
let _ = (Date() - 3.minutes).toRelative(style: RelativeFormatter.twitterStyle(), locale: Locales.english) // "3m"
let _ = (Date() - 6.minutes).toRelative(style: RelativeFormatter.twitterStyle(), locale: Locales.italian) // "6 мин назад"
```<!-- Default Style -->
Пусть `_` = (now2 - 5.часов).toRelative(style: RelativeFormatter.defaultStyle(), locale: Locales.english) // "5 hours ago"
Пусть `y` = (now2 - 40.минут).toRelative(style: RelativeFormatter.defaultStyle(), locale: Locales.italian) // "40 minutes ago"
```swift
<!-- Encoding/Decoding a Region -->
Пусть region = Region(calendar: Calendars.gregorian, zone: Zones.europeOslo, locale: Locales.english)
Пусть encodedJSON = попытаться JSONEncoder().encode(region)
Пусть decodedRegion = попытаться JSONDecoder().decode(Region.self, из: encodedJSON)
<!-- Encoding/Decoding a DateInRegion -->
Пусть date = DateInRegion("2015-09-24T13:20:55", region: region)
Пусть encodedDate = попытаться JSONEncoder().encode(date)
Пусть decodedDate = попытаться JSONDecoder().decode(DateInRegion.self, из: encodedDate)
```<a name="11"/>
### 11. Интервалы времени
SwiftDate интегрирует великолепный модуль [DateTools](https://github.com/MatthewYork/DateTools) от Matthew York для поддержки интервалов времени.
См. раздел [Интервалы времени](/Documentation/12_Timer_Periods.md) в документации.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )