perf(rule_engine): improve the time offset parser

This commit is contained in:
firest 2023-06-24 13:05:27 +00:00
parent ad5c62725a
commit c8c2793944
1 changed files with 18 additions and 9 deletions

View File

@ -22,7 +22,7 @@
-define(DAYS_PER_YEAR, 365).
-define(DAYS_PER_LEAP_YEAR, 366).
-define(DAYS_FROM_0_TO_1970, 719528).
-define(SECONDS_FROM_0_TO_1970, ?DAYS_FROM_0_TO_1970 * ?SECONDS_PER_DAY).
-define(SECONDS_FROM_0_TO_1970, (?DAYS_FROM_0_TO_1970 * ?SECONDS_PER_DAY)).
-export([
formatter/1,
@ -140,12 +140,13 @@ offset_second_("Z") ->
offset_second_("z") ->
0;
offset_second_(Offset) when is_list(Offset) ->
Sign = hd(Offset),
((Sign == $+) orelse (Sign == $-)) orelse
error({bad_time_offset, Offset}),
Signs = #{$+ => 1, $- => -1},
PosNeg = maps:get(Sign, Signs),
[Sign | HM] = Offset,
PosNeg =
case Sign of
$+ -> 1;
$- -> -1;
_ -> error({bad_time_offset, Offset})
end,
{HourStr, MinuteStr, SecondStr} =
case string:tokens(HM, ":") of
[H, M] ->
@ -157,9 +158,9 @@ offset_second_(Offset) when is_list(Offset) ->
_ ->
error({bad_time_offset, Offset})
end,
Hour = erlang:list_to_integer(HourStr),
Minute = erlang:list_to_integer(MinuteStr),
Second = erlang:list_to_integer(SecondStr),
Hour = list_to_int_or_error(HourStr, {bad_time_offset_hour, HourStr}),
Minute = list_to_int_or_error(MinuteStr, {bad_time_offset_minute, MinuteStr}),
Second = list_to_int_or_error(SecondStr, {bad_time_offset_second, SecondStr}),
(Hour =< 23) orelse error({bad_time_offset_hour, Hour}),
(Minute =< 59) orelse error({bad_time_offset_minute, Minute}),
(Second =< 59) orelse error({bad_time_offset_second, Second}),
@ -454,3 +455,11 @@ dm(9) -> 243;
dm(10) -> 273;
dm(11) -> 304;
dm(12) -> 334.
list_to_int_or_error(Str, Error) ->
case string:to_integer(Str) of
{Int, []} ->
Int;
_ ->
error(Error)
end.