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
27
Date and time
Vadym
February 21, 2020
Tweet
Share
More Decks by Vadym
See All by Vadym
Building...Please, wait
degterev
0
52
Как перестать говорить "Ой, я забыл"
degterev
0
51
Other Decks in Programming
See All in Programming
Micro Frontends for Java Microservices - Utah JUG 2024
mraible
PRO
1
100
MetricKitで予期せぬ終了を検知する話 / Detect unexpected termination with MetricKit
nekowen
1
200
サイコロで理解する統計的仮説検定の考え方
tatamiya
4
1k
StoreKit2によるiOSのアプリ内課金のリニューアル
kangnux
0
120
Deep Dive into React Stream/Serialize
mugi_uno
3
550
新宿ダンジョンを可視化してみた
satoshi7190
3
370
SwiftUIで使いやすいToastの作り方 / How to build a Toast system which is easy to use in SwiftUI
lovee
3
160
Node.js v22 で変わること
yosuke_furukawa
PRO
11
3.9k
Compose-View Interop in Practice (mDevCamp 2024)
stewemetal
0
160
Snowflakeで眠ったデータを起こそう!
estie
0
140
GitHub Actionsで泣かないためにやっておきたい設定 / Recommended GHA settings to avoid crying
pinkumohikan
3
560
Ruby Function Composition
bkuhlmann
1
340
Featured
See All Featured
What the flash - Photography Introduction
edds
64
11k
How GitHub (no longer) Works
holman
305
140k
How To Stay Up To Date on Web Technology
chriscoyier
782
250k
No one is an island. Learnings from fostering a developers community.
thoeni
16
2.1k
Agile that works and the tools we love
rasmusluckow
325
20k
Ruby is Unlike a Banana
tanoku
96
10k
[RailsConf 2023] Rails as a piece of cake
palkan
27
4k
Statistics for Hackers
jakevdp
790
220k
Documentation Writing (for coders)
carmenintech
61
4k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
19
1.6k
VelocityConf: Rendering Performance Case Studies
addyosmani
321
23k
Happy Clients
brianwarren
92
6.4k
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