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
0
39
Date and time
Vadym
February 21, 2020
Tweet
Share
More Decks by Vadym
See All by Vadym
Building...Please, wait
degterev
0
59
Как перестать говорить "Ой, я забыл"
degterev
0
71
Other Decks in Programming
See All in Programming
Webinar: AI-Powered Development: Transformiere deinen Workflow mit Coding Tools und MCP Servern
danielsogl
0
110
LLMOpsのパフォーマンスを支える技術と現場で実践した改善
po3rin
8
690
React 使いじゃなくても知っておきたい教養としての React
oukayuka
18
5.5k
あなたとJIT, 今すぐアセンブ ル
sisshiki1969
1
590
STUNMESH-go: Wireguard NAT穿隧工具的源起與介紹
tjjh89017
0
340
Vibe Codingの幻想を超えて-生成AIを現場で使えるようにするまでの泥臭い話.ai
fumiyakume
21
10k
抽象化という思考のツール - 理解と活用 - / Abstraction-as-a-Tool-for-Thinking
shin1x1
1
960
コーディングは技術者(エンジニア)の嗜みでして / Learning the System Development Mindset from Rock Lady
mackey0225
2
330
Bedrock AgentCore ObservabilityによるAIエージェントの運用
licux
9
610
kiroでゲームを作ってみた
iriikeita
0
150
なぜあなたのオブザーバビリティ導入は頓挫するのか
ryota_hnk
5
590
バイブコーディング超えてバイブデプロイ〜CloudflareMCPで実現する、未来のアプリケーションデリバリー〜
azukiazusa1
3
810
Featured
See All Featured
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
StorybookのUI Testing Handbookを読んだ
zakiyama
30
6k
Why You Should Never Use an ORM
jnunemaker
PRO
58
9.5k
Thoughts on Productivity
jonyablonski
69
4.8k
Visualization
eitanlees
146
16k
Statistics for Hackers
jakevdp
799
220k
A designer walks into a library…
pauljervisheath
207
24k
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
Unsuck your backbone
ammeep
671
58k
Side Projects
sachag
455
43k
The Cult of Friendly URLs
andyhume
79
6.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