Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Date and time
Search
Vadym
February 21, 2020
Programming
50
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Date and time
Vadym
February 21, 2020
More Decks by Vadym
See All by Vadym
Building...Please, wait
degterev
0
66
Как перестать говорить "Ой, я забыл"
degterev
0
79
Other Decks in Programming
See All in Programming
ここ半年くらいでAIに作らせたR用ツール
eitsupi
0
370
仕様駆動開発へのトライを機に チームに適合する手法を模索し続けている話
freee
PRO
0
460
【やさしく解説 設計編・中級 #4】ルールの寿命と、システムの年輪
panda728
PRO
2
180
Japan Community Day at Kubecon + CloudNativeCon Japan 2026: Learning Container Privilege Control by Building My Own Low-Level Container Runtime
ternbusty
1
150
進化を続けるGo toolsの現在地 / The Current State of Ever-Evolving Go Tools
hond0413
0
160
仕様書を書く前にハーネスを作る - Agent Native開発は「探索を速く、判定を固く」
gotalab555
4
1.6k
壊れたパーサから始める関数型設計と構成的なパーサ #fp_matsuri
raiga0310
2
450
OpenSpecのproposalにbrainstormingを持たせてみた
tigertora7571
1
210
Apache Hive: Toward a Cloud Native Lakehouse
okumin
0
180
Detecting Compromised CI with eBPF and Cilium Tetragon
lizrice
0
170
【やさしく解説 設計編・中級 #1】一つの車に、運転手は一人 ~ある倉庫システムの事例から~
panda728
PRO
0
210
VibeCodingからAgenticWorkflowへ
starfish719
0
340
Featured
See All Featured
The Language of Interfaces
destraynor
162
27k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
A Tale of Four Properties
chriscoyier
163
24k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.1k
Everyday Curiosity
cassininazir
0
270
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Raft: Consensus for Rubyists
vanstee
141
7.6k
Test your architecture with Archunit
thirion
1
2.3k
Un-Boring Meetings
codingconduct
0
380
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
420
Designing for Performance
lara
611
70k
The browser strikes back
jonoalderson
0
1.5k
Transcript
1577836800.0 Даты и время Дегтерев Вадим 1
Что сегодня? • Unix time в двух словах • Обсудим
UTC • Как обмениваться датами с сервером • Как получить точное время на устройстве • Что у нас в iOS есть для работы с датами и временем 2
Unix time 50! 1577836800 3
Почему такое круглое число? 4
Откуда берется время? 5
Вращение Земли 6
Атомные часы 7
UTC 8
Leap seconds • Международная служба вращения Земли добавляет секунду другую
• После 23:59:59 идет 23:59:60 • 1577836800 • 1577836827 9
А что же нам делать с этим? • Foundation игнорирует
дополнительные секунды • Надеяться, что нам они не понадобятся 10
Отправим пользователя на самолет • Пользователь вылетает 18 02 2020
в 20:05 по Киеву • Время нам нужно получить с сервера • Отправить нотификацию за сутки и за час до вылета 11
Время вылета 1582049126 12
Как же часовой пояс? 2020-02-18T18:05:26+02:00 13
TimeZone identifiers 14 “time_zone”: “Europe/Kiev”, “time”: “1582049126”
15 TimeZone identifiers • Нужно обновлять • Есть deprecated идентификаторы
Минимизируйте данные о времени • Не передавайте часовой пояс если
вам это не нужно • Передавайте только смещение во времени вместо идентификатора TimeZone если вам не нужно учитывать часовые пояса • Не передавайте время, если это не нужно, передавайте дату устройства 16
А как это показывать пользователю? • Все в UTC •
Часовой пояс это ваше view 17
Есть ли время на девайсе? • Да, но не очень
точное 18
NTP • Протокол для получения времени • Один из самых
старых протоколов • Позволяет получать время от специализированных серверов 19
version - версия NTP, mode - режим клиент/сервер, transmit -
время отправки пакета 20
Originate - то что пришло в transmit, Receive - время
получения запроса, Transmit - время отправки ответа 21
Находим разницу времени клиента и сервера по хитрой формуле Receive
— Originate — ((Arrive – Originate) — (Transmit – Receive)) / 2 = 2 * Receive — 2 * Originate – Arrive + Originate + Transmit – Receive = Receive – Originate – Arrive + Transmit 22
Все, время и дата у вас уже есть 23
Готовые решения 24
Kronos 25
Даты и время в iOS Посмотрим что же там у
нас 26
Date let date = Date() // 2020-01-01 00:00:00 +0000 •
Просто точка во времени • По дефолту это TimeInterval с 1 января 2001 года • Не привязана к календарю или часовому поясу 27
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
DateComponents • Если вам нужно использовать не только время •
Если вам нужно учитывать TimeZone или календарь • Если вам нужно производить календарные подсчеты 29
Calendar • Удобно делать календарные вычисления • Считать количество юнитов
между датами • много много всего… 30
DateFormatters • DateFormatter • ISO8601Formatter • DateComponentsFormatter • RelativeDateTimeFormatter 31
DateFormatters • Учитывают Locale • Учитывают Calendar 32
DateFormatter From nshipster.com 33
ISO8601Formatter let isoFormatter = ISO8601DateFormatter() let isoDate = isoFormatter.string(from: date)
print(isoDate) // 2020-01-01T23:00:00Z 34
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
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
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
Summary • Unix time • UTC • Leap seconds •
Date formatters 38
Credits • https://nshipster.com/formatter/ • https://habr.com/ru/post/448060/ • https://habr.com/ru/post/123461/ • https://github.com/lyft/Kronos 39
Contacts 40