defprotocol Timex.Date.Convert do def to_gregorian(date) def to_erlang_datetime(date) end defimpl Timex.Date.Convert, for: Timex.DateTime do alias Timex.DateTime, as: DateTime alias Timex.Timezone, as: Timezone alias Timex.TimezoneInfo, as: TimezoneInfo def to_gregorian( DateTime[ year: y, month: m, day: d, hour: h, minute: min, second: sec, timezone: TimezoneInfo[standard_abbreviation: abbrev, dst_abbreviation: dst_abbrev, gmt_offset_std: std, gmt_offset_dst: dst] ] = date) do # Use the correct abbreviation depending on whether we're in DST or not if Timezone.Dst.is_dst?(date) do { {y, m, d}, {h, min, sec}, {(std + dst) / 60, dst_abbrev} } else { {y, m, d}, {h, min, sec}, {std / 60, abbrev} } end end def to_erlang_datetime(DateTime[year: y, month: m, day: d, hour: h, minute: min, second: sec]) do { {y, m, d}, {h, min, sec} } end end