DateTime.to_unix() vs System.os_time()

DateTime documentation contains the following sentence:

If you want to get the current time in Unix seconds, do not do DateTime.utc_now() |> DateTime.to_unix() . Simply call System.os_time(:second) instead.

Nice, but… System documentation says about os_time/0 and os_time/1 as follows:

This time may be adjusted forwards or backwards in time with no limitation and is not monotonic.

Now, I DO “want to get the current time in Unix seconds” (or microseconds) but I want it to be the current time in UTC, God forbid in one of the tons of useless “time zones”, nor with / without equally useless DST changes. So the question - how is doing System.os_time(:second) supposed to be a better equivalent of doing DateTime.utc_now() |> DateTime.to_unix()? Am I missing something here?

P. S. Yes, I do run my computers (including the one I write these words on) on UTC so I believe in such case I expect those to be equivalent, right? Still more than once I had to work on servers configured… well… differently and had to deal with code that never expected to be run “in different timezone”, so I am really curious what’s the case here

Based on the implementation of DateTime.utc_now/1:

I’d guess the documentation’s suggestion is for efficiency; no point in building an intermediate DateTime just to turn it right back into an integer.


Thank you for your response! Yes, it makes little sense to waste cycles on converting from one representation to another only to convert it immediately back to the original one. But now this is even more confusing. As the DateTime docs say about from_unix!/3:

Unix times are always in UTC and therefore the DateTime will be returned in UTC.

Which would imply that the result of System.os_time() is “always in UTC”. How can (general relativity aside) something that is always in UTC “be adjusted forwards or backwards in time with no limitation […]” as the System docs explicitly warn about?

NTPd adjustments. Simply your machine may have invalid time set and on the next check the time will be shifted to match the result returned from the NTP server.


Right, makes sense! Thanks.