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

Date and time

Vadym
February 21, 2020

Date and time

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