From ec55b3758fc7ac82f5a16105dd8cdf8c6bcb2ed5 Mon Sep 17 00:00:00 2001 From: Marcel Otto Date: Fri, 10 Aug 2018 23:51:04 +0200 Subject: [PATCH] Add RDF.DateTime.tz/1 --- lib/rdf/datatypes/date_time.ex | 16 +++++++++ test/unit/datatypes/date_time_test.exs | 45 ++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/lib/rdf/datatypes/date_time.ex b/lib/rdf/datatypes/date_time.ex index 8ce94059..8adcb342 100644 --- a/lib/rdf/datatypes/date_time.ex +++ b/lib/rdf/datatypes/date_time.ex @@ -54,4 +54,20 @@ defmodule RDF.DateTime do NaiveDateTime.to_iso8601(value) end + def tz(datetime_literal) do + if valid?(datetime_literal) do + lexical = lexical(datetime_literal) + case Regex.run(~r/([+-])(\d\d:\d\d)/, lexical) do + [_, sign, zone] -> + sign <> zone + _ -> + if String.ends_with?(lexical, "Z") do + "Z" + else + "" + end + end + end + end + end diff --git a/test/unit/datatypes/date_time_test.exs b/test/unit/datatypes/date_time_test.exs index 56dd3040..47d8b98f 100644 --- a/test/unit/datatypes/date_time_test.exs +++ b/test/unit/datatypes/date_time_test.exs @@ -61,4 +61,49 @@ defmodule RDF.DateTimeTest do end end + describe "tz/1" do + test "with timezone" do + [ + {"2010-01-01T00:00:00-23:00", "-23:00"}, + {"2010-01-01T00:00:00+23:00", "+23:00"}, + {"2010-01-01T00:00:00+00:00", "+00:00"}, + ] + |> Enum.each(fn {dt, tz} -> + assert dt |> DateTime.new() |> DateTime.tz() == tz + end) + + end + + test "without any specific timezone" do + [ + "2010-01-01T00:00:00Z", + "2010-01-01T00:00:00.0000Z", + ] + |> Enum.each(fn dt -> + assert dt |> DateTime.new() |> DateTime.tz() == "Z" + end) + end + + test "without any timezone" do + [ + "2010-01-01T00:00:00", + "2010-01-01T00:00:00.0000", + ] + |> Enum.each(fn dt -> + assert dt |> DateTime.new() |> DateTime.tz() == "" + end) + end + + test "with invalid timezone literals" do + [ + DateTime.new("2010-01-01T00:0"), + "2010-01-01T00:00:00.0000", + ] + |> Enum.each(fn dt -> + assert DateTime.tz(dt) == nil + end) + + end + end + end