@@ -171,10 +171,35 @@ defmodule NaiveDateTime do
171171 Calendar . microsecond ( ) ,
172172 Calendar . calendar ( )
173173 ) :: { :ok , t } | { :error , atom }
174- def new ( year , month , day , hour , minute , second , microsecond \\ { 0 , 0 } , calendar \\ Calendar.ISO ) do
175- with { :ok , date } <- Date . new ( year , month , day , calendar ) ,
176- { :ok , time } <- Time . new ( hour , minute , second , microsecond , calendar ) ,
177- do: new ( date , time )
174+ def new ( year , month , day , hour , minute , second , microsecond \\ { 0 , 0 } , calendar \\ Calendar.ISO )
175+
176+ def new ( year , month , day , hour , minute , second , microsecond , calendar )
177+ when is_integer ( microsecond ) do
178+ new ( year , month , day , hour , minute , second , { microsecond , 6 } , calendar )
179+ end
180+
181+ def new ( year , month , day , hour , minute , second , microsecond , calendar ) do
182+ cond do
183+ not calendar . valid_date? ( year , month , day ) ->
184+ { :error , :invalid_date }
185+
186+ not calendar . valid_time? ( hour , minute , second , microsecond ) ->
187+ { :error , :invalid_time }
188+
189+ true ->
190+ naive_datetime = % NaiveDateTime {
191+ calendar: calendar ,
192+ year: year ,
193+ month: month ,
194+ day: day ,
195+ hour: hour ,
196+ minute: minute ,
197+ second: second ,
198+ microsecond: microsecond
199+ }
200+
201+ { :ok , naive_datetime }
202+ end
178203 end
179204
180205 @ doc """
0 commit comments