Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 12 additions & 2 deletions liquid_syntax/date.ml
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,18 @@ let now_as_string fmat =
formatted

let format_date_string date_str fmat =
let date = Printer.Date.from_string date_str in
let formatted = Printer.Date.sprint fmat date in
let date =
try Printer.Calendar.from_fstring "%FT%T" date_str
(* ISO with T: "2026-03-06T15:09:00" *)
with Invalid_argument _ ->
try Printer.Calendar.from_fstring "%F %T" date_str
(* Space-separated: "2026-03-06 15:09:00" *)
with Invalid_argument _ ->
(* Date only: "2026-03-06", time defaults to 00:00:00 *)
let d = Printer.Date.from_string date_str in
Calendar.create d (Time.make 0 0 0)
in
let formatted = Printer.Calendar.sprint fmat date in
formatted

let as_string date fmat = Printer.Calendar.sprint fmat date
Expand Down
55 changes: 55 additions & 0 deletions test/test_helper_filters.ml
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,54 @@ let test_date_complex_format () =
let result = render_text ~settings "{{ date_str | date: '%B %d, %Y' }}" in
check string "date complex format" "January 15, 2025" result

(* DateTime with time component tests *)

let test_datetime_iso_format () =
let context =
Ctx.empty |> Ctx.add "date_str" (String "2026-03-06T15:09:00")
in
let settings = Settings.make ~context () in
let result = render_text ~settings "{{ date_str | date: '%Y%m%d-%H%M' }}" in
check string "datetime ISO format" "20260306-1509" result

let test_datetime_iso_date_part () =
let context =
Ctx.empty |> Ctx.add "date_str" (String "2026-03-06T15:09:00")
in
let settings = Settings.make ~context () in
let result = render_text ~settings "{{ date_str | date: '%Y-%m-%d' }}" in
check string "datetime ISO date part only" "2026-03-06" result

let test_datetime_iso_time_part () =
let context =
Ctx.empty |> Ctx.add "date_str" (String "2026-03-06T15:09:30")
in
let settings = Settings.make ~context () in
let result = render_text ~settings "{{ date_str | date: '%H:%M:%S' }}" in
check string "datetime ISO time part" "15:09:30" result

let test_datetime_default_format () =
let context =
Ctx.empty |> Ctx.add "date_str" (String "2026-03-06T15:09:00")
in
let settings = Settings.make ~context () in
let result = render_text ~settings "{{ date_str | date }}" in
check string "datetime default format" "03/06/2026" result

let test_date_only_time_defaults_midnight () =
let context = Ctx.empty |> Ctx.add "date_str" (String "2026-03-06") in
let settings = Settings.make ~context () in
let result = render_text ~settings "{{ date_str | date: '%Y%m%d-%H%M' }}" in
check string "date only time defaults midnight" "20260306-0000" result

let test_datetime_space_separated () =
let context =
Ctx.empty |> Ctx.add "date_str" (String "2026-03-06 15:09:00")
in
let settings = Settings.make ~context () in
let result = render_text ~settings "{{ date_str | date: '%Y%m%d-%H%M' }}" in
check string "datetime space separated format" "20260306-1509" result

let test_date_now_keyword () =
let settings = Settings.make () in
(* We can't test exact output for "now", but we can check it doesn't error *)
Expand Down Expand Up @@ -286,6 +334,13 @@ let suite =
; test_case "date weekday name" `Quick test_date_weekday_name
; test_case "date abbreviated weekday" `Quick test_date_abbreviated_weekday
; test_case "date complex format" `Quick test_date_complex_format
; test_case "datetime ISO format" `Quick test_datetime_iso_format
; test_case "datetime ISO date part" `Quick test_datetime_iso_date_part
; test_case "datetime ISO time part" `Quick test_datetime_iso_time_part
; test_case "datetime default format" `Quick test_datetime_default_format
; test_case "date only time defaults midnight" `Quick
test_date_only_time_defaults_midnight
; test_case "datetime space separated" `Quick test_datetime_space_separated
; test_case "date now keyword" `Quick test_date_now_keyword
; test_case "date now default format" `Quick test_date_now_default_format
(* Default filter tests *)
Expand Down
Loading