73 lines
2.0 KiB
Erlang
73 lines
2.0 KiB
Erlang
-module(ezic).
|
|
-include("include/ezic.hrl").
|
|
|
|
-export([
|
|
localtime/1
|
|
, utc_to_local/2
|
|
, local_to_utc/2
|
|
, has_dst_utc/2
|
|
, has_dst_local/2
|
|
]).
|
|
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
% PUBLIC API
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
|
|
%% returns local time in given timezone
|
|
localtime(TzName) ->
|
|
utc_to_local(erlang:universaltime(), TzName).
|
|
|
|
%% returns time in given timezone for corresponding utc time
|
|
utc_to_local(UTCDatetime, TzName) ->
|
|
NormalDatetime= ezic_date:normalize(UTCDatetime, u),
|
|
utc_to_local_handleFlatzone(UTCDatetime, ezic_db:flatzone(NormalDatetime, TzName)).
|
|
|
|
|
|
|
|
%% returns utc time for corresponding time in given timezone utc
|
|
local_to_utc(LocalDatetime, TzName) ->
|
|
NormalDatetime= ezic_date:normalize(LocalDatetime, w),
|
|
local_to_utc_handleFlatzone(LocalDatetime, ezic_db:flatzone(NormalDatetime, TzName)).
|
|
|
|
|
|
has_dst_utc(Datetime, TzName) ->
|
|
has_dst(Datetime, TzName, u).
|
|
|
|
has_dst_local(Datetime, TzName) ->
|
|
has_dst(Datetime, TzName, w).
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
% PRIVATE
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
utc_to_local_handleFlatzone(_, X={error,_}) ->
|
|
X;
|
|
utc_to_local_handleFlatzone(UTCDatetime, #flatzone{offset=Offset, dstoffset=DSTOffset}) ->
|
|
ezic_date:add_offset(
|
|
ezic_date:add_offset(
|
|
UTCDatetime
|
|
, Offset)
|
|
, DSTOffset).
|
|
|
|
|
|
local_to_utc_handleFlatzone(_, X={error, _}) ->
|
|
X;
|
|
local_to_utc_handleFlatzone(LocalDatetime, #flatzone{offset=Offset, dstoffset=DSTOffset}) ->
|
|
ezic_date:add_offset(
|
|
ezic_date:add_offset(
|
|
LocalDatetime
|
|
, Offset, {0,0,0})
|
|
, DSTOffset, {0,0,0}).
|
|
|
|
has_dst(Datetime, TzName, Flag) ->
|
|
NormalDatetime = ezic_date:normalize(Datetime, Flag),
|
|
case ezic_db:flatzone(NormalDatetime, TzName) of
|
|
#flatzone{dstoffset={0,0,0}} ->
|
|
false;
|
|
#flatzone{dstoffset={_,_,_}} ->
|
|
true
|
|
end.
|
|
|