Created
September 16, 2016 20:18
-
-
Save DoggettCK/acfe3bc27321d836e3752b96e5d728d7 to your computer and use it in GitHub Desktop.
Elixir TimeUtils
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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