 
   @doc """
   Converts the datetime (without time zone) into a string.
-  """
-  @impl true
+
+  ## Examples
+
+    iex> Calendar.ISO.naive_datetime_to_string(2015, 2, 28, 1, 2, 3, {4, 6})
+    "2015-02-28 01:02:03.000004"
+    iex> Calendar.ISO.naive_datetime_to_string(2017, 8, 1, 1, 2, 3, {4, 5})
+    "2017-08-01 01:02:03.00000"
+  """
+  @impl true
+  @spec naive_datetime_to_string(
+          year,
+          month,
+          day,
+          Calendar.hour(),
+          Calendar.minute(),
+          Calendar.second(),
+          Calendar.microsecond()
+        ) :: String.t()
   def naive_datetime_to_string(year, month, day, hour, minute, second, microsecond) do
     date_to_string(year, month, day) <> " " <> time_to_string(hour, minute, second, microsecond)
   end
 
   @doc """
-  Convers the datetime (with time zone) into a string.
-  """
-  @impl true
+  Converts the datetime (with time zone) into a string.
+
+  ## Examples
+
+    iex> Calendar.ISO.datetime_to_string(2017, 8, 1, 1, 2, 3, {4, 5}, "Europe/Berlin", "CET", 3600, 0)
+    "2017-08-01 01:02:03.00000+01:00 CET Europe/Berlin"
+    iex> Calendar.ISO.datetime_to_string(2017, 8, 1, 1, 2, 3, {4, 5}, "Europe/Berlin", "CDT", 3600, 3600)
+    "2017-08-01 01:02:03.00000+02:00 CDT Europe/Berlin"
+    iex> Calendar.ISO.datetime_to_string(2015, 2, 28, 1, 2, 3, {4, 5}, "America/Los_Angeles", "PST", -28800, 0)
+    "2015-02-28 01:02:03.00000-08:00 PST America/Los_Angeles"
+    iex> Calendar.ISO.datetime_to_string(2015, 2, 28, 1, 2, 3, {4, 5}, "America/Los_Angeles", "PDT", -28800, 3600)
+    "2015-02-28 01:02:03.00000-07:00 PDT America/Los_Angeles"
+  """
+  @impl true
+  @spec datetime_to_string(
+          year,
+          month,
+          day,
+          Calendar.hour(),
+          Calendar.minute(),
+          Calendar.second(),
+          Calendar.microsecond(),
+          Calendar.time_zone(),
+          Calendar.zone_abbr(),
+          Calendar.utc_offset(),
+          Calendar.std_offset()
+        ) :: String.t()
   def datetime_to_string(
         year,
         month,

      zone_to_string(utc_offset, std_offset, zone_abbr, time_zone)
  end

  @impl true
  @since "1.5.0"
  def valid_date?(year, month, day) do
    month in 1..12 and year in 0..9999 and day in 1..days_in_month(year, month)
  end

  @impl true
  @since "1.5.0"
  def valid_time?(hour, minute, second, {microsecond, precision}) do
    hour in 0..23 and minute in 0..59 and second in 0..60 and microsecond in 0..999_999 and
      precision in 0..6
  end

  @impl true
  @since "1.5.0"
  def day_rollover_relative_to_midnight_utc() do
    {0, 1}
  end


  @doc """
  Converts the given date into a string.

  ## Examples

    iex> Calendar.ISO.date_to_string(2015, 2, 28)
    "2015-02-28"
    iex> Calendar.ISO.date_to_string(2017, 8, 1)
    "2017-08-01"
  """
  @spec date_to_string(year, month, day) :: String.t()
  @impl true
  def date_to_string(year, month, day) do
    date_to_string(year, month, day, :extended)
