updated some comments to be more accurate, more descriptive

This commit is contained in:
aj
2010-11-12 00:05:57 -08:00
parent 1340f64d8b
commit e042ad5ea9
2 changed files with 26 additions and 15 deletions

View File

@@ -51,7 +51,8 @@ normalize(R={{_,_,_}, #tztime{}}) ->
R. R.
% returns RELATIVE {Y,M,D} for a rule and Year %% returns RELATIVE datetime for a rule and Year
%% -> {{Y,M,D},#tztime{}} | {{Y,M,D},{HH,MM,SS}}
for_rule(#rule{in=M, on=D, at=At}, Y) when is_integer(D) -> for_rule(#rule{in=M, on=D, at=At}, Y) when is_integer(D) ->
{{Y,M,D}, At}; {{Y,M,D}, At};
for_rule(#rule{in=M, on={last, D}, at=At}, Y) -> for_rule(#rule{in=M, on={last, D}, at=At}, Y) ->
@@ -60,12 +61,14 @@ for_rule(#rule{in=M, on=#tzon{day=Day, filter=Filter}, at=At}, Y) ->
{first_day_limited(Day, Filter, Y,M), At}. {first_day_limited(Day, Filter, Y,M), At}.
%% returns set of ALL datetimes for a rule, given the gmt offset and
%% current dst offset.
for_rule_all(Rule, Offset, DSTOffset, Year) -> for_rule_all(Rule, Offset, DSTOffset, Year) ->
DT= for_rule(Rule, Year), DT= for_rule(Rule, Year),
all_times(DT, Offset, DSTOffset). all_times(DT, Offset, DSTOffset).
% returns UTC datetime for rule, offset, and year % returns UTC datetime for rule, offset, dst offset, and year
for_rule_utc(Rule, Offset, DSTOffset, Year) -> for_rule_utc(Rule, Offset, DSTOffset, Year) ->
{_,_,UTCDatetime} = for_rule_all(Rule, Offset, DSTOffset, Year), {_,_,UTCDatetime} = for_rule_all(Rule, Offset, DSTOffset, Year),
UTCDatetime. UTCDatetime.
@@ -278,16 +281,20 @@ add_days_in_month(Days, Date={Y,M,D}) ->
%% subtracts 1 second from a single datetime
% @todo type checking
m1s(Date= {{Y,M,D},{HH,MM,SS}}) m1s(Date= {{Y,M,D},{HH,MM,SS}})
when is_integer(Y), is_integer(M), is_integer(D) when is_integer(Y), is_integer(M), is_integer(D)
, is_integer(HH), is_integer(MM), is_integer(SS) -> , is_integer(HH), is_integer(MM), is_integer(SS) ->
calendar:gregorian_seconds_to_datetime(calendar:datetime_to_gregorian_seconds(Date) - 1); calendar:gregorian_seconds_to_datetime(calendar:datetime_to_gregorian_seconds(Date) - 1);
%% subtracts 1 second from all datetimes
% @todo type checking
m1s({WD, SD, UD}) -> m1s({WD, SD, UD}) ->
{m1s(WD), m1s(SD), m1s(UD)}. {m1s(WD), m1s(SD), m1s(UD)}.
%% subtracts 1 second from all datetimes
% @todo type checking % @todo type checking
m1s(W,S,U) when is_tuple(W), is_tuple(S), is_tuple(U) -> m1s(W,S,U) when is_tuple(W), is_tuple(S), is_tuple(U) ->
{m1s(W), m1s(S), m1s(U)}. {m1s(W), m1s(S), m1s(U)}.

View File

@@ -45,9 +45,10 @@ flatten_all_zones([Z1|_]= AllZones, Flats) ->
% takes zones one-by-one, gathering relevant rules and creating flat %% takes zones one-by-one from a list of zones of the same name. It
% periods of the same gmt offset (#flatzone). This is a recursive %% gathers relevant rules and creates flat periods of the same gmt
% solution, eliminating Zones until they've been exhausted %% offset (#flatzone). This is a recursive solution, eliminating Zones
%% from the list until it's been exhausted
flatten_zone_set(Zones) -> flatten_zone_set(Zones) ->
flatten_zone_set(?MINFLAT, Zones, []). flatten_zone_set(?MINFLAT, Zones, []).
@@ -67,16 +68,17 @@ flatten_zone_set(FromTimeStub=#flatzone{utc_from=UTCFrom, dstoffset=DSTOffset}
[Zone | _RestZones] = ezic_zone:next(Zones, UTCFrom, DSTOffset), [Zone | _RestZones] = ezic_zone:next(Zones, UTCFrom, DSTOffset),
#zone{rule=RuleName, until=_UntilTime, gmtoff=Offset}=Zone, #zone{rule=RuleName, until=_UntilTime, gmtoff=Offset}=Zone,
%% we have a flatzone with start times, we populate the base offset %% we have a flatzone with start times; must populate the base gmt offset
FromTime= FromTimeStub#flatzone{offset=Offset}, FromTime= FromTimeStub#flatzone{offset=Offset},
%% note that dst offset default to {0,0,0} in #flatzone{} %% if this is the first run, DST offset is {0,0,0}
%% if this is a recursion, DST offset is the previous zone's DST offset
%% we gather all rules that _may_ apply (same year) %% we gather all rules that _may_ apply (same year)
Rules= ezic_db:rules(RuleName), Rules= ezic_db:rules(RuleName),
%% tack the date onto the zone, so we can see if it ends before a rule does %% tack the date onto the zone, so we can see if the zone ends before a rule does
ZoneWithDate= {ezic_zone:project_end_utc(Zone, DSTOffset), Zone}, ZoneWithDate= {ezic_zone:project_end_utc(Zone, DSTOffset), Zone},
@@ -117,10 +119,11 @@ flatten_zone_set(FromTimeStub=#flatzone{utc_from=UTCFrom, dstoffset=DSTOffset}
flatten_rule_set(FlatStart=#flatzone{utc_from=UTCFrom, dstoffset=DSTOffset, offset=Offset} flatten_rule_set(FlatStart=#flatzone{utc_from=UTCFrom, dstoffset=DSTOffset, offset=Offset}
, ZoneWithDate, Rules, Flats) -> , ZoneWithDate, Rules, Flats) ->
%% and add normalized (possibly inaccurate) dates for sorting purposes %% add normalized (possibly inaccurate) dates for sorting
%% note this may be empty %% purposes. note this may be empty. also note this MUST (I think)
%% also note this MUST (I think) be done in the loop, since UTCFrom and DSTOffset %% be done in the loop, since UTCFrom and DSTOffset can
%% can potentially change which rule comes next (however unlikely) %% potentially change which rule comes next (however unlikely that
%% case may be in real life)
RulesWithDates= lists:foldl( RulesWithDates= lists:foldl(
fun(R, Acc)-> fun(R, Acc)->
case ezic_rule:project_next(R, Offset, DSTOffset, UTCFrom) of case ezic_rule:project_next(R, Offset, DSTOffset, UTCFrom) of
@@ -145,7 +148,7 @@ flatten_rule_set(FlatStart=#flatzone{utc_from=UTCFrom, dstoffset=DSTOffset, offs
NewFlats= [EndFlat | Flats], NewFlats= [EndFlat | Flats],
flatten_rule_set(NextFlat, ZoneWithDate, Rules, NewFlats); flatten_rule_set(NextFlat, ZoneWithDate, Rules, NewFlats);
false -> false ->
%% new zone is handled in calling function: flatten_zone_set %% new zone is handled in the caller: flatten_zone_set
Flats Flats
end. end.
@@ -154,8 +157,9 @@ flatten_rule_set(FlatStart=#flatzone{utc_from=UTCFrom, dstoffset=DSTOffset, offs
finish_and_start_flat(FlatStub=#flatzone{utc_from=_UTCFrom}, EndingRule=#rule{}, _EndingRuleDate={{ERDY,_,_},_}, Offset, DSTOffset) -> finish_and_start_flat(FlatStub=#flatzone{utc_from=_UTCFrom}, EndingRule=#rule{}, _EndingRuleDate={{ERDY,_,_},_}, Offset, DSTOffset) ->
%% @todo for_rule_all was already called in a loop earlier. use those values instead.
NewFlatStartDates={WD, SD, UD}= ezic_date:for_rule_all(EndingRule, Offset, DSTOffset, ERDY), NewFlatStartDates={WD, SD, UD}= ezic_date:for_rule_all(EndingRule, Offset, DSTOffset, ERDY),
_FlatEndDates={WDm, SDm, UDm}= ezic_date:m1s(NewFlatStartDates), {WDm, SDm, UDm}= ezic_date:m1s(NewFlatStartDates),
EndFlat= ?ENDFLAT(FlatStub, WDm, SDm, UDm, DSTOffset), EndFlat= ?ENDFLAT(FlatStub, WDm, SDm, UDm, DSTOffset),
NewFlat1= ?FLAT(WD, SD, UD), NewFlat1= ?FLAT(WD, SD, UD),