@@ -437,22 +437,22 @@ defmodule Mongo.Ecto do
437437 def loaders ( :binary , type ) , do: [ & load_binary / 1 , type ]
438438 def loaders ( _base , type ) , do: [ type ]
439439
440- defp load_time ( % BSON.DateTime { } = time ) do
441- { { _ , _ , _ } , time } = BSON.DateTime . to_datetime ( time )
442- { :ok , time }
443- end
440+ defp load_time ( time ) ,
441+ do: Time . to_erl ( time )
444442 defp load_time ( _ ) ,
445443 do: :error
446444
447- defp load_date ( % BSON.DateTime { } = date ) do
448- { date , { _ , _ , _ , _ } } = BSON.DateTime . to_datetime ( date )
449- { :ok , date }
450- end
445+ defp load_date ( date ) ,
446+ do: Date . from_erl ( date )
451447 defp load_date ( _ ) ,
452448 do: :error
453449
454- defp load_datetime ( % BSON.DateTime { } = datetime ) ,
455- do: { :ok , BSON.DateTime . to_datetime ( datetime ) }
450+ defp load_datetime ( datetime ) do
451+ naive = DateTime . to_naive ( datetime )
452+ { date , { h , m , s } } = NaiveDateTime . to_erl ( naive )
453+ { x , _ } = naive . microsecond
454+ { :ok , { date , { h , m , s , x } } }
455+ end
456456 defp load_datetime ( _ ) ,
457457 do: :error
458458
@@ -472,28 +472,45 @@ defmodule Mongo.Ecto do
472472 defp load_objectid ( _ ) , do: :error
473473
474474 @ doc false
475- def dumpers ( :time , type ) , do: [ type , & dump_time / 1 ]
476- def dumpers ( :date , type ) , do: [ type , & dump_date / 1 ]
477- def dumpers ( :utc_datetime , type ) , do: [ type , & dump_datetime / 1 ]
478- def dumpers ( :naive_datetime , type ) , do: [ type , & dump_datetime / 1 ]
479- def dumpers ( :binary_id , type ) , do: [ type , & dump_objectid / 1 ]
480- def dumpers ( :uuid , type ) , do: [ type , & dump_binary ( & 1 , :uuid ) ]
481- def dumpers ( :binary , type ) , do: [ type , & dump_binary ( & 1 , :generic ) ]
482- def dumpers ( _base , type ) , do: [ type ]
483-
484- defp dump_time ( { _ , _ , _ , _ } = time ) ,
485- do: { :ok , BSON.DateTime . from_datetime ( { { 0 , 0 , 0 } , time } ) }
475+ def dumpers ( :time , type ) , do: [ type , & dump_time / 1 ]
476+ def dumpers ( :date , type ) , do: [ type , & dump_date / 1 ]
477+ def dumpers ( :utc_datetime , type ) , do: [ type , & dump_utc_datetime / 1 ]
478+ def dumpers ( :naive_datetime , type ) , do: [ type , & dump_naive_datetime / 1 ]
479+ def dumpers ( :binary_id , type ) , do: [ type , & dump_objectid / 1 ]
480+ def dumpers ( :uuid , type ) , do: [ type , & dump_binary ( & 1 , :uuid ) ]
481+ def dumpers ( :binary , type ) , do: [ type , & dump_binary ( & 1 , :generic ) ]
482+ def dumpers ( _base , type ) , do: [ type ]
483+
484+ defp dump_time ( { h , m , s , _ } = time ) ,
485+ do: Time . from_erl ( { h , m , s } )
486486 defp dump_time ( _ ) ,
487487 do: :error
488488
489489 defp dump_date ( { _ , _ , _ } = date ) ,
490- do: { :ok , BSON.DateTime . from_datetime ( { date , { 0 , 0 , 0 , 0 } } ) }
490+ do: Date . from_erl! ( date )
491491 defp dump_date ( _ ) ,
492492 do: :error
493493
494- defp dump_datetime ( { { _ , _ , _ } , { _ , _ , _ , _ } } = datetime ) ,
495- do: { :ok , BSON.DateTime . from_datetime ( datetime ) }
496- defp dump_datetime ( _ ) ,
494+ defp dump_utc_datetime ( { { _ , _ , _ } = date , { h , m , s , ms } } = v ) do
495+ datetime =
496+ { date , { h , m , s } }
497+ |> NaiveDateTime . from_erl! ( { ms , 6 } )
498+ |> DateTime . from_naive! ( "Etc/UTC" )
499+
500+ { :ok , datetime }
501+ end
502+ defp dump_utc_datetime ( _ ) ,
503+ do: :error
504+
505+ defp dump_naive_datetime ( { { _ , _ , _ } = date , { h , m , s , ms } } = v ) do
506+ datetime =
507+ { date , { h , m , s } }
508+ |> NaiveDateTime . from_erl! ( { ms , 6 } )
509+ |> DateTime . from_naive! ( "Etc/UTC" )
510+
511+ { :ok , datetime }
512+ end
513+ defp dump_naive_datetime ( _ ) ,
497514 do: :error
498515
499516 defp dump_binary ( binary , subtype ) when is_binary ( binary ) ,
0 commit comments