Skip to content

Instantly share code, notes, and snippets.

@DoggettCK
Created September 16, 2016 20:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save DoggettCK/acfe3bc27321d836e3752b96e5d728d7 to your computer and use it in GitHub Desktop.
Save DoggettCK/acfe3bc27321d836e3752b96e5d728d7 to your computer and use it in GitHub Desktop.
Elixir TimeUtils
defmodule TimeUtils do
@ms_filetime_offset 116444736000000000
def filetime_to_unix(filetime) do
div(filetime - @ms_filetime_offset, 10000)
end
def unix_to_filetime(datetime) do
@ms_filetime_offset + (datetime * 10000)
end
def filetime_to_datetime(filetime) do
filetime
|> filetime_to_unix
|> DateTime.from_unix!(:milliseconds)
end
def filetime_to_human_readable(filetime) do
filetime
|> filetime_to_datetime
|> DateTime.to_string
end
def datetime_to_filetime(%DateTime{} = datetime) do
datetime
|> DateTime.to_unix(:milliseconds)
|> unix_to_filetime
end
def human_utc_to_filetime(year, month, day, hour \\ 0, minute \\ 0, second \\ 0, millisecond \\ 0) do
%DateTime{ calendar: Calendar.ISO, std_offset: 0, time_zone: "Etc/UTC", utc_offset: 0, zone_abbr: "UTC",
year: year, month: month, day: day,
hour: hour, minute: minute, second: second,
microsecond: { millisecond * 1000, 3 } }
|> datetime_to_filetime
end
def datetime_to_hex_string(%DateTime{} = datetime) do
datetime
|> datetime_to_filetime
|> Integer.to_string(16)
|> String.rjust(16, ?0)
end
def datetime_to_bytes(%DateTime{} = datetime) do
<< datetime_to_filetime(datetime)::unsigned-integer-size(64) >>
end
def datetime_from_bytes(<< filetime::unsigned-integer-size(64) >>) do
filetime
|> filetime_to_datetime
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment