max_year base case bug fixed. ezic:localtime/1 works.

the final flatzone for every Zone should end at "current" for every *_to time. This is inaccurate, but accuracy is only guaranteed up to ?MAX_YEAR (=2500 by default).
that working, I fleshed out the few methods required to get ezic:utc_to_localtime/2 working, thus localtime/1 working. I've only tested localtime/1 at this point.
additionally, mnesia appears to have its data corrupted every time I stop and start a node. I've got to read up on working with mnesia; it's not behaving as I would expect.
This commit is contained in:
aj
2010-11-14 00:27:44 -08:00
parent d664384c60
commit 22395e2f47
4 changed files with 76 additions and 16 deletions

View File

@@ -8,7 +8,13 @@
, next_timechange_after/2 , next_timechange_after/2
]). ]).
-export([load/1, dev/0, test/0]). -export([
load/1
, dev/0
, test/0
, reflatten/0
, zf/0
]).
@@ -28,8 +34,14 @@ localtime(TzName) ->
utc_to_local(UTCDatetime, TzName) -> utc_to_local(UTCDatetime, TzName) ->
#flatzone{offset=Offset, dstoffset=DSTOffset}= ezic_db:flatzone(UTCDatetime, TzName), NormalDatetime= ezic_date:normalize(UTCDatetime, u),
ezic_date:add_offset(ezic_date:add_offset(UTCDatetime, Offset), DSTOffset). #flatzone{offset=Offset, dstoffset=DSTOffset}= ezic_db:flatzone(NormalDatetime, TzName),
ezic_date:add_offset(
ezic_date:add_offset(
UTCDatetime
, Offset)
, DSTOffset).
@@ -57,11 +69,22 @@ load(Folder) ->
dev() -> dev() ->
ezic:load(filename:join("priv","tzdata")), ezic:load(filename:join("priv","tzdata")),
ezic_flatten:flatten(), ezic_flatten:flatten(),
% Zones= ezic_db:zones("WET"), % Zones= ezic_db:zones("WET"),
% ezic_flatten:flatten_all_zones(Zones), % ezic_flatten:flatten_all_zones(Zones),
ok. ok.
zf() ->
Zones= ezic_db:zones("Asia/Tokyo"),
ezic_flatten:flatten_all_zones(Zones).
reflatten() ->
ezic_db:wipe(flatzone),
ezic_flatten:flatten().
test() -> test() ->
lists:foreach( lists:foreach(

View File

@@ -43,6 +43,7 @@
%% USED EXCLUSIVELY FOR COMPARISONS. The resulting "datetime" values may not %% USED EXCLUSIVELY FOR COMPARISONS. The resulting "datetime" values may not
%% represent true dates or times. %% represent true dates or times.
%% @todo ensure atom is valid %% @todo ensure atom is valid
%% assumes wall time, if no #tztime{} given
normalize(A) when is_atom(A) -> normalize(A) when is_atom(A) ->
A; A;
normalize(Y) when is_integer(Y) -> normalize(Y) when is_integer(Y) ->
@@ -253,10 +254,7 @@ compare({Date1, #tztime{time=Time1, flag=F}}
Date1 =< Date2 orelse Time1 =< time2; Date1 =< Date2 orelse Time1 =< time2;
compare(X,Y) -> compare(X,Y) ->
XN= normalize(X), erlang:error(bad_dates, [X,Y]).
YN= normalize(Y),
compare(XN, YN).
equal(X,Y) when X=:=Y -> equal(X,Y) when X=:=Y ->

View File

@@ -5,7 +5,7 @@
-export([zones/1, rules/1, flatzones/1, flatzone/2]). -export([zones/1, rules/1, flatzones/1, flatzone/2]).
-export([wipe/0, init/0, insert_all/1, get_all/1]). -export([wipe/0, wipe/1, init/0, insert_all/1, get_all/1]).
-define(create(Record), -define(create(Record),
@@ -63,10 +63,9 @@ flatzones(TzName) ->
flatzone(Date, TzName) -> flatzone(Date, TzName) ->
F = fun()-> F = fun()->
Q = qlc:q( Q = qlc:q(
[Fz || Fz=#flatzone{tzname=N, utc_from=UF, utc_to=UT} <- mnesia:table(flatzone) [Fz || Fz=#flatzone{tzname=N} <- mnesia:table(flatzone)
, N=:=TzName , N=:=TzName
, ezic_date:compare(UF, Date) , ezic_flatten:contains_date(Fz, Date)]),
, ezic_date:compare(Date, UT)]),
qlc:e(Q) qlc:e(Q)
end, end,
{atomic, [FlatZone]}= mnesia:transaction(F), {atomic, [FlatZone]}= mnesia:transaction(F),
@@ -108,6 +107,16 @@ wipe() ->
mnesia:delete_schema([node()]). mnesia:delete_schema([node()]).
% WARNING: deletes all entries in table Tab
wipe(Tab) ->
mnesia:transaction(
fun()->
mnesia:delete(Tab, '_', write)
end).
create_tabs(ok) -> create_tabs(ok) ->
mnesia:start(), mnesia:start(),

View File

@@ -13,7 +13,10 @@
-define(MAXYEAR, 2500). % last year to process flatzones for. -define(MAXYEAR, 2500). % last year to process flatzones for.
-export([flatten/0]). -export([
flatten/0
, contains_date/2
]).
%% debug %% debug
@@ -27,6 +30,12 @@ flatten() ->
done. done.
contains_date(FlatZone, Date) ->
NDate= ezic_date:normalize(Date),
contains_date2(FlatZone, NDate).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% PRIVATE % PRIVATE
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -47,7 +56,19 @@ flatten_all_zones([Z1|_]= AllZones) ->
contains_date2(FlatZone=#flatzone{utc_from=From, utc_to=To}, {Dt,#tztime{time=T, flag=F}})
when F=:= u; F=:= g; F=:=z ->
Date={Dt, T},
ezic_date:compare(From, Date) andalso ezic_date:compare(Date, To);
contains_date2(FlatZone=#flatzone{std_from=From, std_to=To}, {Dt,#tztime{time=T, flag=s}}) ->
Date={Dt, T},
ezic_date:compare(From, Date) andalso ezic_date:compare(Date, To);
contains_date2(FlatZone=#flatzone{wall_from=From, wall_to=To}, {Dt,#tztime{time=T, flag=F}})
when F=:=w; F=:=undefined ->
Date={Dt, T},
ezic_date:compare(From, Date) andalso ezic_date:compare(Date, To).
@@ -161,7 +182,9 @@ flatten_rule_set(FlatStart=#flatzone{utc_from=UTCFrom, dstoffset=DSTOffset, offs
try maxyear_reached(UTCEndingRuleDate) andalso maxyear_reached(ZoneDate) of try maxyear_reached(UTCEndingRuleDate) andalso maxyear_reached(ZoneDate) of
true -> true ->
?debugMsg("maxyear reached from flatten_rule_set"), ?debugMsg("maxyear reached from flatten_rule_set"),
{Flats, #flatzone{utc_from=maximum}, none}; {EndFlat, NextFlat}= finish_and_start_flat(max_year, FlatStart, DSTOffset),
NewFlats= [EndFlat | Flats],
{NewFlats, NextFlat, none};
false -> false ->
case ezic_date:compare(ZoneDate, UTCEndingRuleDate) of case ezic_date:compare(ZoneDate, UTCEndingRuleDate) of
@@ -227,7 +250,14 @@ finish_and_start_flat(FlatStub=#flatzone{}, Zone=#zone{}, EndingDST) ->
?debugVal(EndFlat), ?debugVal(EndFlat),
% ?debugVal(RetNextFlat), % ?debugVal(RetNextFlat),
{EndFlat, RetNextFlat}. {EndFlat, RetNextFlat};
finish_and_start_flat(max_year, FlatStub, DSTOffset) ->
EndFlat= ?ENDFLAT(FlatStub, current, current, current, DSTOffset),
Stop= {{?MAXYEAR+1,1,1},{0,0,0}},
NextFlat= #flatzone{utc_from=Stop},
{EndFlat, NextFlat}.
%% both timezone and rule are ending at the same time %% both timezone and rule are ending at the same time