diff --git a/apps/emqx_rule_engine/test/emqx_rule_funcs_SUITE.erl b/apps/emqx_rule_engine/test/emqx_rule_funcs_SUITE.erl index 358cca3fe..f0c5434d8 100644 --- a/apps/emqx_rule_engine/test/emqx_rule_funcs_SUITE.erl +++ b/apps/emqx_rule_engine/test/emqx_rule_funcs_SUITE.erl @@ -1181,7 +1181,18 @@ t_parse_date_errors(_) -> ?assertEqual( UnixTsLeap2, emqx_rule_funcs:date_to_unix_ts(second, <<"%Y-%m-%d %H:%M:%S">>, <<"2024-03-04 06:56:27">>) - ). + ), + + %% None zero zone shift with millisecond level precision + Tz1 = calendar:rfc3339_to_system_time("2024-02-23T15:00:00.123+08:00", [{unit, second}]), + ?assertEqual( + Tz1, + emqx_rule_funcs:date_to_unix_ts( + second, <<"%Y-%m-%d %H:%M:%S.%3N%:z">>, <<"2024-02-23 15:00:00.123+08:00">> + ) + ), + + ok. %%------------------------------------------------------------------------------ %% Utility functions diff --git a/apps/emqx_utils/src/emqx_utils_calendar.erl b/apps/emqx_utils/src/emqx_utils_calendar.erl index a57bba544..a3c1450cd 100644 --- a/apps/emqx_utils/src/emqx_utils_calendar.erl +++ b/apps/emqx_utils/src/emqx_utils_calendar.erl @@ -507,7 +507,7 @@ do_parse(DateStr, Unit, Formatter) -> (nanosecond, V, Res) -> Res + V; (parsed_offset, V, Res) -> - Res - V + Res - V * Precise end, Count = maps:fold(Counter, 0, DateInfo) - (?SECONDS_PER_DAY * Precise), erlang:convert_time_unit(Count, PrecisionUnit, Unit). diff --git a/changes/ce/fix-12646.en.md b/changes/ce/fix-12646.en.md new file mode 100644 index 000000000..5edd92cd7 --- /dev/null +++ b/changes/ce/fix-12646.en.md @@ -0,0 +1,3 @@ +Fix rule engine date time string parser. + +Prior to this fix, time zone shift can only work when date time string is at second level precision.