Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Date and time

Avatar for Vadym Vadym
February 21, 2020

Date and time

Avatar for Vadym

Vadym

February 21, 2020
Tweet

More Decks by Vadym

Other Decks in Programming

Transcript

  1. Что сегодня? • Unix time в двух словах • Обсудим

    UTC • Как обмениваться датами с сервером • Как получить точное время на устройстве • Что у нас в iOS есть для работы с датами и временем 2
  2. А что же нам делать с этим? • Foundation игнорирует

    дополнительные секунды • Надеяться, что нам они не понадобятся 10
  3. Отправим пользователя на самолет • Пользователь вылетает 18 02 2020

    в 20:05 по Киеву • Время нам нужно получить с сервера • Отправить нотификацию за сутки и за час до вылета 11
  4. Минимизируйте данные о времени • Не передавайте часовой пояс если

    вам это не нужно • Передавайте только смещение во времени вместо идентификатора TimeZone если вам не нужно учитывать часовые пояса • Не передавайте время, если это не нужно, передавайте дату устройства 16
  5. NTP • Протокол для получения времени • Один из самых

    старых протоколов • Позволяет получать время от специализированных серверов 19
  6. Originate - то что пришло в transmit, Receive - время

    получения запроса, Transmit - время отправки ответа 21
  7. Находим разницу времени клиента и сервера по хитрой формуле Receive

    — Originate — ((Arrive – Originate) — (Transmit – Receive)) / 2 =
 2 * Receive — 2 * Originate – Arrive + Originate + Transmit – Receive = 
 Receive – Originate – Arrive + Transmit 22
  8. Date let date = Date() // 2020-01-01 00:00:00 +0000 •

    Просто точка во времени • По дефолту это TimeInterval с 1 января 2001 года • Не привязана к календарю или часовому поясу 27
  9. DateComponents DateComponents( calendar: .current, timeZone: .current, era: 1, year: 2020,

    month: 1, day: 1, hour: 1, minute: 0, second: 0, nanosecond: 0, weekday: 5, weekdayOrdinal: 1, quarter: 0, weekOfMonth: 1, weekOfYear: 1, yearForWeekOfYear: 2020 ) 28
  10. DateComponents • Если вам нужно использовать не только время •

    Если вам нужно учитывать TimeZone или календарь • Если вам нужно производить календарные подсчеты 29
  11. ISO8601Formatter let json = #""" { "greeting": "Hello, CocoaFriday!", "date":

    "2020-02-21T09:41:00+02:00" } """#.data(using: .utf8)! struct CocoaFriday: Codable { let greeting: String let date: Date } let decoder = JSONDecoder() decoder.dateDecodingStrategy = .iso8601 let model = decoder.decode(CocoaFriday.self, from: json) print(model) // CocoaFriday(greeting: "Hello, CocoaFriday!", date: 2020-02-21 07:41:00 +0000) 35
  12. RelativeDateTimeFormatter let formatter = RelativeDateTimeFormatter() formatter.localizedString(from: DateComponents(day: 1, hour: 1))

    // "in 1 day" formatter.localizedString(from: DateComponents(day: -1)) // "1 day ago" formatter.localizedString(from: DateComponents(hour: 3)) // "in 3 hours" formatter.localizedString(from: DateComponents(minute: 60)) // "in 60 minutes" 36
  13. RelativeDateTimeFormatter let formatter = RelativeDateTimeFormatter() formatter.locale = Locale(identifier: "fr_FR") formatter.localizedString(from:

    DateComponents(day: 1, hour: 1)) // "dans 1 jour" formatter.localizedString(from: DateComponents(day: -1)) // "il y a 1 jour" formatter.localizedString(from: DateComponents(hour: 3)) // "dans 3 heures" formatter.localizedString(from: DateComponents(minute: 60)) // "dans 60 minutes" 37