diff --git a/graphene/core/types/custom_scalars.py b/graphene/core/types/custom_scalars.py index 72f0f8b0..2dad3c64 100644 --- a/graphene/core/types/custom_scalars.py +++ b/graphene/core/types/custom_scalars.py @@ -1,5 +1,5 @@ -import datetime import json +import iso8601 from graphql.core.language import ast @@ -33,9 +33,8 @@ class DateTime(Scalar): @staticmethod def parse_literal(node): if isinstance(node, ast.StringValue): - return datetime.datetime.strptime( - node.value, "%Y-%m-%dT%H:%M:%S.%f") + return iso8601.parse_date(node.value) @staticmethod def parse_value(value): - return datetime.datetime.strptime(value, "%Y-%m-%dT%H:%M:%S.%f") + return iso8601.parse_date(value) diff --git a/graphene/core/types/tests/test_custom_scalars.py b/graphene/core/types/tests/test_custom_scalars.py new file mode 100644 index 00000000..49c9a9c7 --- /dev/null +++ b/graphene/core/types/tests/test_custom_scalars.py @@ -0,0 +1,27 @@ +import iso8601 + +from graphql.core.language.ast import StringValue + +from ..custom_scalars import DateTime + + +def test_date_time(): + test_iso_string = "2016-04-29T18:34:12.502Z" + + def check_datetime(test_dt): + assert test_dt.tzinfo == iso8601.UTC + assert test_dt.year == 2016 + assert test_dt.month == 4 + assert test_dt.day == 29 + assert test_dt.hour == 18 + assert test_dt.minute == 34 + assert test_dt.second == 12 + + test_dt = DateTime().parse_value(test_iso_string) + check_datetime(test_dt) + + assert DateTime.serialize(test_dt) == "2016-04-29T18:34:12.502000+00:00" + + node = StringValue(test_iso_string) + test_dt = DateTime.parse_literal(node) + check_datetime(test_dt) diff --git a/setup.py b/setup.py index 93a08561..d0476511 100644 --- a/setup.py +++ b/setup.py @@ -57,6 +57,7 @@ setup( 'six>=1.10.0', 'graphql-core>=0.4.9', 'graphql-relay==0.3.3', + 'iso8601', ], tests_require=[ 'django-filter>=0.10.0',