Slide 1

Slide 1 text

Calendar types in Elixir 1.3 ElixirConf 2016

Slide 2

Slide 2 text

Lau Taarnskov Software developer Open source contributor. Creator of Calendar for Elixir and tzdata Blog: creativedeletion.com Twitter: @laut Github: lau

Slide 3

Slide 3 text

Lau Taarnskov - twitter: @LauT What is a type?

Slide 4

Slide 4 text

Lau Taarnskov - twitter: @LauT Why have types?

Slide 5

Slide 5 text

Lau Taarnskov - twitter: @LauT iex(1)> 5/2 2.5

Slide 6

Slide 6 text

Lau Taarnskov - twitter: @LauT iex(1)> 5/2 2.5 iex(2)> 5/"Orlando" ** (ArithmeticError) bad argument in arithmetic expression :erlang./(5, "Orlando")

Slide 7

Slide 7 text

Lau Taarnskov - twitter: @LauT We want errors instead of non-sensical results

Slide 8

Slide 8 text

Lau Taarnskov - twitter: @LauT Explicit data

Slide 9

Slide 9 text

Lau Taarnskov - twitter: @LauT

Slide 10

Slide 10 text

Lau Taarnskov - twitter: @LauT Mars Climate Orbiter Mission cost: $327.6 million Mission failure after a 286 day journey to Mars

Slide 11

Slide 11 text

Lau Taarnskov - twitter: @LauT Newton-seconds? Oh, we used pound seconds.

Slide 12

Slide 12 text

Lau Taarnskov - twitter: @LauT 5, 6, 3, 9, 4, 5…

Slide 13

Slide 13 text

Lau Taarnskov - twitter: @LauT {5, :lbs_s}, {6, :lbs_s}, {3, :lbs_s}, {9, :lbs_s}, {4, :lbs_s}, {5, :lbs_s}…

Slide 14

Slide 14 text

Lau Taarnskov - twitter: @LauT %ThrusterData{amount: 5, unit: :lbs_s}, %ThrusterData{amount: 6, unit: :lbs_s}, %ThrusterData{amount: 3, unit: :lbs_s},

Slide 15

Slide 15 text

Lau Taarnskov - twitter: @LauT def process_thruster_data(%{amount: amount, unit: :n_s}) do # ... end ** (FunctionClauseError) no function clause matching in ThrustProcessor.process_thruster_data/1 thruster.ex:12: ThrustProcessor.process_thruster_data(%ThrusterData{amou nt: 3, unit: :lbs_s}) thruster.ex:17: (file) (elixir) lib/code.ex:363: Code.require_file/2

Slide 16

Slide 16 text

Lau Taarnskov - twitter: @LauT Different units of time and date

Slide 17

Slide 17 text

Lau Taarnskov - twitter: @LauT 2016 2016 September 2016 September 2nd 2016 September 2nd at 14:01:03 2016-09-02 at 14:01:03 in New York 14:01 14:01:03 14:01:03.9472 ….

Slide 18

Slide 18 text

Lau Taarnskov - twitter: @LauT One type to rule them all?

Slide 19

Slide 19 text

Lau Taarnskov - twitter: @LauT 2016-09-02 2016-09-02 00:00:00.000 UTC

Slide 20

Slide 20 text

Lau Taarnskov - twitter: @LauT 06:10 2001-01-01 06:10:00.000 UTC

Slide 21

Slide 21 text

Lau Taarnskov - twitter: @LauT 2001-01-01 00:00:00.000 2001-01-01 06:10:00.000 UTC

Slide 22

Slide 22 text

Lau Taarnskov - twitter: @LauT 6:10 What year is that in? 2001 (!!!!!!!)

Slide 23

Slide 23 text

Lau Taarnskov - twitter: @LauT 2016-09-02 At what hour and minute? 00:00 (!!!)

Slide 24

Slide 24 text

Lau Taarnskov - twitter: @LauT Year Year with month Year, month, day of month Hour Hour and minute Hour and minute and second …

Slide 25

Slide 25 text

Lau Taarnskov - twitter: @LauT The structs in the Calendar library

Slide 26

Slide 26 text

Lau Taarnskov - twitter: @LauT Types in Calendar in 2014 Calendar.Date Calendar.Time Calendar.NaiveDateTime Calendar.DateTime

Slide 27

Slide 27 text

Lau Taarnskov - twitter: @LauT Date: year, month, day

Slide 28

Slide 28 text

Lau Taarnskov - twitter: @LauT Time: hour, minute, second, microsecond

Slide 29

Slide 29 text

Lau Taarnskov - twitter: @LauT NaiveDateTime: year, month, day, hour, minute, second, microsecond

Slide 30

Slide 30 text

Lau Taarnskov - twitter: @LauT DateTime: year, month, day, hour, minute, second, microsecond, time zone, UTC offset, standard offset, zone abbreviation

Slide 31

Slide 31 text

Lau Taarnskov - twitter: @LauT Local vs Naive

Slide 32

Slide 32 text

Lau Taarnskov - twitter: @LauT JAVA 8 Class LocalDate A date without a time-zone in the ISO-8601 calendar system, such as 2007-12-03.

Slide 33

Slide 33 text

Lau Taarnskov - twitter: @LauT local |ˈlōk(ə)l| adjective belonging or relating to a particular area or neighborhood, typically exclusively so: researching local history | the local post office.

Slide 34

Slide 34 text

Lau Taarnskov - twitter: @LauT

Slide 35

Slide 35 text

Lau Taarnskov - twitter: @LauT ~N[1970-01-01 00:00:00] |> DateTime.to_unix ** (FunctionClauseError) no function clause matching in DateTime.to_unix/2 (elixir) lib/calendar.ex:1078: DateTime.to_unix(~N[1970-01-01 00:00:00], :seconds)

Slide 36

Slide 36 text

Lau Taarnskov - twitter: @LauT The structs built into Elixir 1.3

Slide 37

Slide 37 text

Lau Taarnskov - twitter: @LauT Types in Calendar in 2014 Types in Elixir 1.3 in 2016 Calendar.Date Date Calendar.Time Time Calendar.NaiveDateTime NaiveDateTime Calendar.DateTime DateTime

Slide 38

Slide 38 text

Lau Taarnskov - twitter: @LauT Sigils ~D[2016-09-02] ~T[14:15:00] ~N[2016-09-02 14:15:00]

Slide 39

Slide 39 text

Lau Taarnskov - twitter: @LauT %DateTime{calendar: Calendar.ISO, day: 1, hour: 0, microsecond: {0, 0}, …

Slide 40

Slide 40 text

Lau Taarnskov - twitter: @LauT %DateTime{calendar: Calendar.ISO, day: 1, hour: 0, microsecond: {0, 0}, …

Slide 41

Slide 41 text

Lau Taarnskov - twitter: @LauT "2016-09-02 14:15:00.1234” |> NaiveDateTime.from_iso8601! ~N[2016-09-02 14:15:00.1234] "2016-09-02 14:15:00.1” |> NaiveDateTime.from_iso8601! ~N[2016-09-02 14:15:00.1] Significant fractional seconds

Slide 42

Slide 42 text

Lau Taarnskov - twitter: @LauT "2016-09-02 14:15:00.1234” |> NaiveDateTime.from_iso8601! |> Map.get(:microsecond) {123400, 4} "2016-09-02 14:15:00.10” |> NaiveDateTime.from_iso8601! |> Map.get(:microsecond) {100000, 2} "2016-09-02 14:15:00” |> NaiveDateTime.from_iso8601! |> Map.get(:microsecond) {0, 0} Significant fractional seconds

Slide 43

Slide 43 text

Lau Taarnskov - twitter: @LauT Time zones and more functionality with the Calendar library

Slide 44

Slide 44 text

Lau Taarnskov - twitter: @LauT The Calendar library

Slide 45

Slide 45 text

Lau Taarnskov - twitter: @LauT ~N[1970-01-01 00:00:00] |> Calendar.NaiveDateTime.to_date_time_utc |> DateTime.to_unix 0

Slide 46

Slide 46 text

Lau Taarnskov - twitter: @LauT DateTime.from_unix!(1472836167) %DateTime{calendar: Calendar.ISO, day: 2, hour: 17, microsecond: {0, 0}, minute: 9, month: 9, second: 27, std_offset: 0, time_zone: "Etc/UTC", utc_offset: 0, year: 2016, zone_abbr: "UTC"}

Slide 47

Slide 47 text

Lau Taarnskov - twitter: @LauT DateTime.from_unix!(1472836167) |> Calendar.DateTime.shift_zone!("America/New_York") %DateTime{calendar: Calendar.ISO, day: 2, hour: 13, microsecond: {0, 0}, minute: 9, month: 9, second: 27, std_offset: 3600, time_zone: "America/New_York", utc_offset: -18000, year: 2016, zone_abbr: "EDT"}

Slide 48

Slide 48 text

Lau Taarnskov - twitter: @LauT DateTime.from_unix!(1472836167) |> Calendar.DateTime.shift_zone(“America/New_York”) |> DateTime.to_iso8601 "2016-09-02T13:09:27-04:00"

Slide 49

Slide 49 text

Lau Taarnskov - twitter: @LauT DateTime.from_unix(1472836167) |> Calendar.DateTime.shift_zone!(“America/New_York”) |> Calendar.Strftime.strftime!("%Y %B %d, %H:%M:%S %Z") "2016 September 02, 13:09:27 EDT"

Slide 50

Slide 50 text

Lau Taarnskov - twitter: @LauT ~D[2016-09-02] |> Calendar.Date.friday? true

Slide 51

Slide 51 text

Lau Taarnskov - twitter: @LauT ~D[2016-09-02] |> Calendar.Date.before? (~D[2016-09-03]) true

Slide 52

Slide 52 text

Lau Taarnskov - twitter: @LauT ~D[2016-09-02] |>Calendar.Date.next_day! ~D[2016-09-03]

Slide 53

Slide 53 text

Lau Taarnskov - twitter: @LauT Calendar.Date.today(“Amer ica/New_York") |> Calendar.Date.next_day! ~D[2016-09-03]

Slide 54

Slide 54 text

Lau Taarnskov - twitter: @LauT ~D[2016-09-02] |> Calendar.Date.add!(7) |> Date.to_iso8601 "2016-09-09"

Slide 55

Slide 55 text

Lau Taarnskov - twitter: @LauT Getting the time zone of a user

Slide 56

Slide 56 text

Lau Taarnskov - twitter: @LauT Persistence in Ecto

Slide 57

Slide 57 text

Lau Taarnskov - twitter: @LauT The Calecto library

Slide 58

Slide 58 text

Lau Taarnskov - twitter: @LauT You want to select a type that fits the data

Slide 59

Slide 59 text

Lau Taarnskov - twitter: @LauT Thank you

Slide 60

Slide 60 text

Lau Taarnskov - twitter: @LauT Questions