무시 시간대를 완전히 여기에 (그것이 그렇게하기 모든 것을 UTC로 변환하는 것이 가장 쉽고, 지역에 상관없이 캐스트하십시오.) 순수 얼랭 (Erlang) 방식은이 선을 따라 뭔가를하는 것입니다.
1> Event = {{2017,05,23},{13,11,23}}.
{{2017,5,23},{13,11,23}}
2> Now = calendar:local_time().
{{2017,10,24},{14,44,1}}
3> EventGSec = calendar:datetime_to_gregorian_seconds(Event).
63662764283
4> NowGSec = calendar:datetime_to_gregorian_seconds(Now).
63676075441
5> Elapsed = NowGSec - EventGSec.
13311158
6> calendar:seconds_to_daystime(Elapsed).
{154,{1,32,38}}
정확한 해결책은 필요한 해상도에 따라 달라집니다. 내가 거기에 확신
-
-spec elapsed_time(calendar:datetime()) -> {Days, Time}
when Days :: non_neg_integer(),
Time :: calendar:time().
elapsed_time(Event) ->
Now = calendar:local_time(),
EventGSec = calendar:datetime_to_gregorian_seconds(Event),
NowGSec = calendar:datetime_to_gregorian_seconds(Now),
Elapsed = NowGSec - EventGSec,
calendar:seconds_to_daystime(Elapsed).
(why would you ever do that?을하지만, 물론, 위 한 줄에 구성 될 수 있음) : 형태 {Days, {Hours, Minutes, Seconds}}
의 튜플을 반환하는 함수로 그 추출하는 것은 우리를 제공합니다 전혀 다른 방식으로 일을하는 와일드 엘릭서 라이브러리입니다. 그 (것)들과 가진 재미를보십시오. 이 대답은 기본 네이티브 라이브러리에만 적용됩니다. Erlang 표준 라이브러리의 대부분의 시간 함수는 이전 erlang:now()
타임 스탬프 형식 (현재 사용되지 않음) 대신 정수 기반 시간 단위 (초, 밀리 초 또는 나노 초)를 기반으로합니다. 위의 함수 버전을 작성해야하는 정확한 방법은 사용자가 요구하는 해상도의 종류와 원래 입력의 형식에 따라 다릅니다 (예 : Unix-era nanoseconds는 자신이 처리하는 타임 스탬프 유형에 대해 매우 일반적입니다. datetime 데이터 유형에는 적용 할 수 없음).
기억 : 시간 계산이 까다 롭고 미묘하며 가장자리 경우에 올바르게 진행되기 어려움. 대부분의 언어에 대한 표준 라이브러리는 실제로 많은 TZ를 가져오고 시간 차이는 잘못 발행됩니다. 문제가 없다면 걱정하지 마십시오. 어쨌든 표준 문서의 Time and Time Correction in Erlang 페이지를 감추는 것이 좋습니다. 현재 상황에 적용되지 않더라도 미묘한 타이밍 문제가 중요한 상황에 처할 것입니다.