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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Vadym
February 21, 2020
Programming
51
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
82
Other Decks in Programming
See All in Programming
Go 1.27 における memory allocation の高速化
andpad
0
370
源内ハンズオン概要編
hideg
0
240
AIを上手に使っていこうとしたら越境せざるを得なくなった話 〜実践1年で見えた境界を越えなければならない理由と進め方〜 / Crossing borders with AI
tomoyakitaura
2
930
異なる設計思想のフレームワークを経験して得た学び
amekuhideki
2
1.4k
Webエンジニアなのにブラウザの仕組みがわからないので、Pythonで自作してみた
tatsuki12
4
1.6k
高専キャリア LT 発表内容
crysta1221
6
5.4k
片田舎のおっさん、 Swift Buildのダイアモンド問題解決の不具合修正PRを出すが、解決方法がキャッシュをしないようにすることであり、ビルド時間が伸びると言われてマージされないので高速化もする/swiftbuild
yimajo
0
340
kubernetes コンポーネント開発入門 / 新卒N年目の勉強会&交流会!〜〇〇への誘い〜 #n_study
mazrean
0
130
ソフトウェアエンジニアにとっての生成AI - 特性を知って使い倒す / generative ai for software enginner
kishida
7
2.3k
LLMは4年分のCompose移行を再現できるのか?実プロダクト279件のXMLで探る自動化の境界線
makun
0
260
不幸な GC
chencmd
0
860
Gmail/Google DriveをトリガーにAIエージェントを動かそう! / Run AI agents with Gmail/Google Drive as triggers!
har1101
3
460
Featured
See All Featured
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
550
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
500
The #1 spot is gone: here's how to win anyway
tamaranovitovic
3
1.1k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.4k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
290
The Limits of Empathy - UXLibs8
cassininazir
1
630
RailsConf 2023
tenderlove
30
1.5k
Testing 201, or: Great Expectations
jmmastey
46
8.3k
Scaling GitHub
holman
464
140k
Technical Leadership for Architectural Decision Making
baasie
3
550
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
230
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