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
67
Other Decks in Programming
See All in Programming
Enterprise Web App. Development (2): Version Control Tool Training Ver. 5.1
knakagawa
1
120
Systèmes distribués, pour le meilleur et pour le pire - BreizhCamp 2025 - Conférence
slecache
0
110
なぜ「共通化」を考え、失敗を繰り返すのか
rinchoku
1
590
deno-redisの紹介とJSRパッケージの運用について (toranoana.deno #21)
uki00a
0
150
Node-RED を(HTTP で)つなげる MCP サーバーを作ってみた
highu
0
110
PHP 8.4の新機能「プロパティフック」から学ぶオブジェクト指向設計とリスコフの置換原則
kentaroutakeda
2
660
GoのGenericsによるslice操作との付き合い方
syumai
3
690
第9回 情シス転職ミートアップ 株式会社IVRy(アイブリー)の紹介
ivry_presentationmaterials
1
250
データの民主化を支える、透明性のあるデータ利活用への挑戦 2025-06-25 Database Engineering Meetup#7
y_ken
0
320
ふつうの技術スタックでアート作品を作ってみる
akira888
0
180
技術同人誌をMCP Serverにしてみた
74th
1
440
ruby.wasmで多人数リアルタイム通信ゲームを作ろう
lnit
2
290
Featured
See All Featured
Become a Pro
speakerdeck
PRO
28
5.4k
KATA
mclloyd
30
14k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
130
19k
Being A Developer After 40
akosma
90
590k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
10
930
The Language of Interfaces
destraynor
158
25k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
46
9.6k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
252
21k
Faster Mobile Websites
deanohume
307
31k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
229
22k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
48
2.8k
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