diff --git a/src/ezic.erl b/src/ezic.erl index e045288..3995f90 100644 --- a/src/ezic.erl +++ b/src/ezic.erl @@ -4,6 +4,7 @@ -export([ localtime/1 , utc_to_local/2 + , local_to_utc/2 , next_timechange/1 , next_timechange_after/2 ]). @@ -44,6 +45,16 @@ utc_to_local(UTCDatetime, TzName) -> , DSTOffset). +local_to_utc(LocalDatetime, TzName) -> + NormalDatetime= ezic_date:normalize(LocalDatetime, w), + #flatzone{offset=Offset, dstoffset=DSTOffset}= ezic_db:flatzone(NormalDatetime, TzName), + + ezic_date:add_offset( + ezic_date:add_offset( + LocalDatetime + , Offset, {0,0,0}) + , DSTOffset, {0,0,0}). + next_timechange(TzName) -> diff --git a/src/ezic_db.erl b/src/ezic_db.erl index 11c7891..73d2613 100644 --- a/src/ezic_db.erl +++ b/src/ezic_db.erl @@ -68,9 +68,18 @@ flatzone(Date, TzName) -> , ezic_flatten:contains_date(Fz, Date)]), qlc:e(Q) end, - {atomic, [FlatZone]}= mnesia:transaction(F), - FlatZone. - + {atomic, FlatZones}= mnesia:transaction(F), + + case length(FlatZones) of + 1 -> + hd(FlatZones); + 2 -> + erlang:error(ambiguous_zone, FlatZones); + 0 -> + erlang:error(no_zone); + _ -> + erlang:error(should_not_happen, {FlatZones, Date, TzName}) + end. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%