From bd4e6078f2e24b780274d79d1a4336fdc533bf4c Mon Sep 17 00:00:00 2001 From: aj Date: Sun, 14 Nov 2010 00:46:00 -0800 Subject: [PATCH] ezic:local_to_utc/2 added, working. in the case of ambiguous timezones, an "ambiguous_zone" error is thrown with the two valid zones. if no zones existed for the given local time (i.e. DST eliminated the hour in question), a "no_zone" error is thrown. otherwise, the date is returned --- src/ezic.erl | 11 +++++++++++ src/ezic_db.erl | 15 ++++++++++++--- 2 files changed, 23 insertions(+), 3 deletions(-) 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. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%