diff --git a/base/cplusplus/test/inputs/json/misc/0a358.json/default/quicktype.hpp b/head/cplusplus/test/inputs/json/misc/0a358.json/default/quicktype.hpp
index 8bd502a..a3aea38 100644
--- a/base/cplusplus/test/inputs/json/misc/0a358.json/default/quicktype.hpp
+++ b/head/cplusplus/test/inputs/json/misc/0a358.json/default/quicktype.hpp
@@ -149,12 +149,12 @@ namespace quicktype {
     inline void from_json(const json & j, Result& x) {
         if (!j.is_object()) throw std::runtime_error("Expected object");
         x.set_code(j.at("code").get<std::string>());
-        if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_created_at(j.at("created_at").get<std::string>());
         if (j.find("id") != j.end() && !j.at("id").is_number_integer()) throw std::runtime_error("Expected integer");
         x.set_id(j.at("id").get<int64_t>());
         x.set_name(j.at("name").get<std::string>());
-        if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_updated_at(j.at("updated_at").get<std::string>());
         x.set_uri(j.at("uri").get<std::string>());
     }
diff --git a/base/cplusplus/test/inputs/json/misc/0a91a.json/default/quicktype.hpp b/head/cplusplus/test/inputs/json/misc/0a91a.json/default/quicktype.hpp
index a63be40..d1db62b 100644
--- a/base/cplusplus/test/inputs/json/misc/0a91a.json/default/quicktype.hpp
+++ b/head/cplusplus/test/inputs/json/misc/0a91a.json/default/quicktype.hpp
@@ -1243,7 +1243,7 @@ namespace quicktype {
         x.set_compare_url(j.at("compare_url").get<std::string>());
         x.set_contents_url(j.at("contents_url").get<std::string>());
         x.set_contributors_url(j.at("contributors_url").get<std::string>());
-        if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_created_at(j.at("created_at").get<std::string>());
         x.set_default_branch(j.at("default_branch").get<std::string>());
         x.set_deployments_url(j.at("deployments_url").get<std::string>());
@@ -1289,7 +1289,7 @@ namespace quicktype {
         x.set_open_issues_count(j.at("open_issues_count").get<int64_t>());
         x.set_owner(j.at("owner").get<MergedBy>());
         x.set_pulls_url(j.at("pulls_url").get<std::string>());
-        if (j.find("pushed_at") != j.end() && !std::regex_match(j.at("pushed_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("pushed_at") != j.end() && !std::regex_match(j.at("pushed_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_pushed_at(j.at("pushed_at").get<std::string>());
         x.set_releases_url(j.at("releases_url").get<std::string>());
         x.set_repo_private(j.at("private").get<bool>());
@@ -1306,7 +1306,7 @@ namespace quicktype {
         x.set_tags_url(j.at("tags_url").get<std::string>());
         x.set_teams_url(j.at("teams_url").get<std::string>());
         x.set_trees_url(j.at("trees_url").get<std::string>());
-        if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_updated_at(j.at("updated_at").get<std::string>());
         x.set_url(j.at("url").get<std::string>());
         if (j.find("watchers") != j.end() && !j.at("watchers").is_number_integer()) throw std::runtime_error("Expected integer");
@@ -1450,7 +1450,7 @@ namespace quicktype {
         x.set_body(j.at("body").get<std::string>());
         if (j.find("changed_files") != j.end() && !j.at("changed_files").is_number_integer()) throw std::runtime_error("Expected integer");
         x.set_changed_files(j.at("changed_files").get<int64_t>());
-        if (j.find("closed_at") != j.end() && !std::regex_match(j.at("closed_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("closed_at") != j.end() && !std::regex_match(j.at("closed_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_closed_at(j.at("closed_at").get<std::string>());
         if (j.find("comments") != j.end() && !j.at("comments").is_number_integer()) throw std::runtime_error("Expected integer");
         x.set_comments(j.at("comments").get<int64_t>());
@@ -1458,7 +1458,7 @@ namespace quicktype {
         if (j.find("commits") != j.end() && !j.at("commits").is_number_integer()) throw std::runtime_error("Expected integer");
         x.set_commits(j.at("commits").get<int64_t>());
         x.set_commits_url(j.at("commits_url").get<std::string>());
-        if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_created_at(j.at("created_at").get<std::string>());
         if (j.find("deletions") != j.end() && !j.at("deletions").is_number_integer()) throw std::runtime_error("Expected integer");
         x.set_deletions(j.at("deletions").get<int64_t>());
@@ -1475,7 +1475,7 @@ namespace quicktype {
         x.set_mergeable(get_untyped(j, "mergeable"));
         x.set_mergeable_state(j.at("mergeable_state").get<std::string>());
         x.set_merged(j.at("merged").get<bool>());
-        if (j.find("merged_at") != j.end() && !std::regex_match(j.at("merged_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("merged_at") != j.end() && !std::regex_match(j.at("merged_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_merged_at(j.at("merged_at").get<std::string>());
         x.set_merged_by(j.at("merged_by").get<MergedBy>());
         x.set_milestone(get_untyped(j, "milestone"));
@@ -1491,7 +1491,7 @@ namespace quicktype {
         x.set_state(j.at("state").get<std::string>());
         x.set_statuses_url(j.at("statuses_url").get<std::string>());
         x.set_title(j.at("title").get<std::string>());
-        if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_updated_at(j.at("updated_at").get<std::string>());
         x.set_url(j.at("url").get<std::string>());
         x.set_user(j.at("user").get<MergedBy>());
@@ -1613,7 +1613,7 @@ namespace quicktype {
     inline void from_json(const json & j, TopLevelElement& x) {
         if (!j.is_object()) throw std::runtime_error("Expected object");
         x.set_actor(j.at("actor").get<Actor>());
-        if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_created_at(j.at("created_at").get<std::string>());
         x.set_id(j.at("id").get<std::string>());
         if (j.find("org") != j.end() && j.at("org").is_null()) throw std::runtime_error("Unexpected null");
diff --git a/base/cplusplus/test/inputs/json/misc/16bc5.json/default/quicktype.hpp b/head/cplusplus/test/inputs/json/misc/16bc5.json/default/quicktype.hpp
index f3ba96d..bdbe623 100644
--- a/base/cplusplus/test/inputs/json/misc/16bc5.json/default/quicktype.hpp
+++ b/head/cplusplus/test/inputs/json/misc/16bc5.json/default/quicktype.hpp
@@ -711,7 +711,7 @@ namespace quicktype {
         if (!j.is_object()) throw std::runtime_error("Expected object");
         if (j.find("count") != j.end() && !j.at("count").is_number_integer()) throw std::runtime_error("Expected integer");
         x.set_count(j.at("count").get<int64_t>());
-        if (j.find("created") != j.end() && !std::regex_match(j.at("created").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("created") != j.end() && !std::regex_match(j.at("created").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_created(j.at("created").get<std::string>());
         x.set_lang(j.at("lang").get<std::string>());
         x.set_results(j.at("results").get<Results>());
diff --git a/base/cplusplus/test/inputs/json/misc/262f0.json/default/quicktype.hpp b/head/cplusplus/test/inputs/json/misc/262f0.json/default/quicktype.hpp
index 8e31cc4..181adf9 100644
--- a/base/cplusplus/test/inputs/json/misc/262f0.json/default/quicktype.hpp
+++ b/head/cplusplus/test/inputs/json/misc/262f0.json/default/quicktype.hpp
@@ -716,7 +716,7 @@ namespace quicktype {
         if (!j.is_object()) throw std::runtime_error("Expected object");
         if (j.find("count") != j.end() && !j.at("count").is_number_integer()) throw std::runtime_error("Expected integer");
         x.set_count(j.at("count").get<int64_t>());
-        if (j.find("created") != j.end() && !std::regex_match(j.at("created").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("created") != j.end() && !std::regex_match(j.at("created").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_created(j.at("created").get<std::string>());
         x.set_lang(j.at("lang").get<std::string>());
         x.set_results(j.at("results").get<Results>());
diff --git a/base/cplusplus/test/inputs/json/misc/337ed.json/default/quicktype.hpp b/head/cplusplus/test/inputs/json/misc/337ed.json/default/quicktype.hpp
index d54076c..8d9dc57 100644
--- a/base/cplusplus/test/inputs/json/misc/337ed.json/default/quicktype.hpp
+++ b/head/cplusplus/test/inputs/json/misc/337ed.json/default/quicktype.hpp
@@ -386,13 +386,13 @@ namespace quicktype {
         if (!j.is_object()) throw std::runtime_error("Expected object");
         if (j.find("amount") != j.end() && !j.at("amount").is_number_integer()) throw std::runtime_error("Expected integer");
         x.set_amount(j.at("amount").get<int64_t>());
-        if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_created_at(j.at("created_at").get<std::string>());
         x.set_id(j.at("id").get<std::string>());
         x.set_name(j.at("name").get<std::string>());
         x.set_status(j.at("status").get<Status>());
         x.set_type(j.at("type").get<CustomIncomeType>());
-        if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_updated_at(j.at("updated_at").get<std::string>());
         x.set_uri(j.at("uri").get<std::string>());
     }
@@ -417,12 +417,12 @@ namespace quicktype {
         x.set_cost_max(get_stack_optional<int64_t>(j, "cost_max"));
         j.at("cost_min");
         x.set_cost_min(get_stack_optional<int64_t>(j, "cost_min"));
-        if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_created_at(j.at("created_at").get<std::string>());
         x.set_custom_incomes(j.at("customIncomes").get<std::vector<CustomIncome>>());
         x.set_direct_rep_costs_max(get_untyped(j, "direct_rep_costs_max"));
         x.set_direct_rep_costs_min(get_untyped(j, "direct_rep_costs_min"));
-        if (j.find("end_date") != j.end() && !std::regex_match(j.at("end_date").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("end_date") != j.end() && !std::regex_match(j.at("end_date").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_end_date(j.at("end_date").get<std::string>());
         if (j.find("eur_sources_grants") != j.end() && !j.at("eur_sources_grants").is_number_integer()) throw std::runtime_error("Expected integer");
         x.set_eur_sources_grants(j.at("eur_sources_grants").get<int64_t>());
@@ -451,7 +451,7 @@ namespace quicktype {
         j.at("public_financing_total");
         x.set_public_financing_total(get_stack_optional<int64_t>(j, "public_financing_total"));
         x.set_representative(j.at("representative").get<std::string>());
-        if (j.find("start_date") != j.end() && !std::regex_match(j.at("start_date").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("start_date") != j.end() && !std::regex_match(j.at("start_date").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_start_date(j.at("start_date").get<std::string>());
         x.set_status(j.at("status").get<Status>());
         j.at("total_budget");
@@ -463,7 +463,7 @@ namespace quicktype {
         j.at("turnover_min");
         x.set_turnover_min(get_stack_optional<int64_t>(j, "turnover_min"));
         x.set_type(j.at("type").get<ResultType>());
-        if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_updated_at(j.at("updated_at").get<std::string>());
         x.set_uri(j.at("uri").get<std::string>());
     }
diff --git a/base/cplusplus/test/inputs/json/misc/3f1ce.json/default/quicktype.hpp b/head/cplusplus/test/inputs/json/misc/3f1ce.json/default/quicktype.hpp
index a154e0a..b2a3b78 100644
--- a/base/cplusplus/test/inputs/json/misc/3f1ce.json/default/quicktype.hpp
+++ b/head/cplusplus/test/inputs/json/misc/3f1ce.json/default/quicktype.hpp
@@ -716,7 +716,7 @@ namespace quicktype {
         if (!j.is_object()) throw std::runtime_error("Expected object");
         if (j.find("count") != j.end() && !j.at("count").is_number_integer()) throw std::runtime_error("Expected integer");
         x.set_count(j.at("count").get<int64_t>());
-        if (j.find("created") != j.end() && !std::regex_match(j.at("created").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("created") != j.end() && !std::regex_match(j.at("created").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_created(j.at("created").get<std::string>());
         x.set_lang(j.at("lang").get<std::string>());
         x.set_results(j.at("results").get<Results>());
diff --git a/base/cplusplus/test/inputs/json/misc/4c547.json/default/quicktype.hpp b/head/cplusplus/test/inputs/json/misc/4c547.json/default/quicktype.hpp
index f3ba96d..bdbe623 100644
--- a/base/cplusplus/test/inputs/json/misc/4c547.json/default/quicktype.hpp
+++ b/head/cplusplus/test/inputs/json/misc/4c547.json/default/quicktype.hpp
@@ -711,7 +711,7 @@ namespace quicktype {
         if (!j.is_object()) throw std::runtime_error("Expected object");
         if (j.find("count") != j.end() && !j.at("count").is_number_integer()) throw std::runtime_error("Expected integer");
         x.set_count(j.at("count").get<int64_t>());
-        if (j.find("created") != j.end() && !std::regex_match(j.at("created").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("created") != j.end() && !std::regex_match(j.at("created").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_created(j.at("created").get<std::string>());
         x.set_lang(j.at("lang").get<std::string>());
         x.set_results(j.at("results").get<Results>());
diff --git a/base/cplusplus/test/inputs/json/misc/54d32.json/default/quicktype.hpp b/head/cplusplus/test/inputs/json/misc/54d32.json/default/quicktype.hpp
index 60351cc..30966d2 100644
--- a/base/cplusplus/test/inputs/json/misc/54d32.json/default/quicktype.hpp
+++ b/head/cplusplus/test/inputs/json/misc/54d32.json/default/quicktype.hpp
@@ -153,13 +153,13 @@ namespace quicktype {
 
     inline void from_json(const json & j, Result& x) {
         if (!j.is_object()) throw std::runtime_error("Expected object");
-        if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_created_at(j.at("created_at").get<std::string>());
         x.set_id(j.at("id").get<std::string>());
         x.set_person_id(j.at("person_id").get<std::string>());
         x.set_representative_id(j.at("representative_id").get<std::string>());
         x.set_status(j.at("status").get<Status>());
-        if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_updated_at(j.at("updated_at").get<std::string>());
     }
 
diff --git a/base/cplusplus/test/inputs/json/misc/5eae5.json/default/quicktype.hpp b/head/cplusplus/test/inputs/json/misc/5eae5.json/default/quicktype.hpp
index a401db6..d829583 100644
--- a/base/cplusplus/test/inputs/json/misc/5eae5.json/default/quicktype.hpp
+++ b/head/cplusplus/test/inputs/json/misc/5eae5.json/default/quicktype.hpp
@@ -69,7 +69,7 @@ namespace quicktype {
 
     inline void from_json(const json & j, TopLevelElement& x) {
         if (!j.is_object()) throw std::runtime_error("Expected object");
-        if (j.find("Date") != j.end() && !std::regex_match(j.at("Date").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("Date") != j.end() && !std::regex_match(j.at("Date").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_date(j.at("Date").get<std::string>());
         if (j.find("ID") != j.end() && !j.at("ID").is_number_integer()) throw std::runtime_error("Expected integer");
         x.set_id(j.at("ID").get<int64_t>());
diff --git a/base/cplusplus/test/inputs/json/misc/6dec6.json/default/quicktype.hpp b/head/cplusplus/test/inputs/json/misc/6dec6.json/default/quicktype.hpp
index 1aef807..32ca1d8 100644
--- a/base/cplusplus/test/inputs/json/misc/6dec6.json/default/quicktype.hpp
+++ b/head/cplusplus/test/inputs/json/misc/6dec6.json/default/quicktype.hpp
@@ -716,7 +716,7 @@ namespace quicktype {
         if (!j.is_object()) throw std::runtime_error("Expected object");
         if (j.find("count") != j.end() && !j.at("count").is_number_integer()) throw std::runtime_error("Expected integer");
         x.set_count(j.at("count").get<int64_t>());
-        if (j.find("created") != j.end() && !std::regex_match(j.at("created").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("created") != j.end() && !std::regex_match(j.at("created").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_created(j.at("created").get<std::string>());
         x.set_lang(j.at("lang").get<std::string>());
         x.set_results(j.at("results").get<Results>());
diff --git a/base/cplusplus/test/inputs/json/misc/734ad.json/default/quicktype.hpp b/head/cplusplus/test/inputs/json/misc/734ad.json/default/quicktype.hpp
index 8e64a97..d2ab92f 100644
--- a/base/cplusplus/test/inputs/json/misc/734ad.json/default/quicktype.hpp
+++ b/head/cplusplus/test/inputs/json/misc/734ad.json/default/quicktype.hpp
@@ -478,7 +478,7 @@ namespace quicktype {
         x.set_code_of_conduct(j.at("code_of_conduct").get<std::string>());
         if (j.find("contact_country") != j.end() && !j.at("contact_country").is_number_integer()) throw std::runtime_error("Expected integer");
         x.set_contact_country(j.at("contact_country").get<int64_t>());
-        if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_created_at(j.at("created_at").get<std::string>());
         x.set_entity(j.at("entity").get<std::string>());
         x.set_goals(j.at("goals").get<std::string>());
@@ -498,7 +498,7 @@ namespace quicktype {
         x.set_id(j.at("id").get<std::string>());
         x.set_identification_code(j.at("identification_code").get<std::string>());
         x.set_info_members(j.at("info_members").get<std::string>());
-        if (j.find("last_update_date") != j.end() && !std::regex_match(j.at("last_update_date").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("last_update_date") != j.end() && !std::regex_match(j.at("last_update_date").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_last_update_date(j.at("last_update_date").get<std::string>());
         x.set_legal(j.at("legal").get<std::string>());
         x.set_legal_status(j.at("legal_status").get<std::string>());
@@ -524,14 +524,14 @@ namespace quicktype {
         x.set_number_of_natural_persons(get_stack_optional<int64_t>(j, "number_of_natural_persons"));
         j.at("other_code_of_conduct");
         x.set_other_code_of_conduct(get_stack_optional<std::string>(j, "other_code_of_conduct"));
-        if (j.find("registration_date") != j.end() && !std::regex_match(j.at("registration_date").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("registration_date") != j.end() && !std::regex_match(j.at("registration_date").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_registration_date(j.at("registration_date").get<std::string>());
         x.set_status(j.at("status").get<Status>());
         x.set_structure_members(j.at("structure_members").get<std::string>());
         if (j.find("sub_category") != j.end() && !j.at("sub_category").is_number_integer()) throw std::runtime_error("Expected integer");
         x.set_sub_category(j.at("sub_category").get<int64_t>());
         x.set_sub_category_title(j.at("sub_category_title").get<std::string>());
-        if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_updated_at(j.at("updated_at").get<std::string>());
         x.set_uri(j.at("uri").get<std::string>());
         j.at("web_site_url");
diff --git a/base/cplusplus/test/inputs/json/misc/77392.json/default/quicktype.hpp b/head/cplusplus/test/inputs/json/misc/77392.json/default/quicktype.hpp
index b6236d5..38bac59 100644
--- a/base/cplusplus/test/inputs/json/misc/77392.json/default/quicktype.hpp
+++ b/head/cplusplus/test/inputs/json/misc/77392.json/default/quicktype.hpp
@@ -167,7 +167,7 @@ namespace quicktype {
     inline void from_json(const json & j, TopLevelElement& x) {
         if (!j.is_object()) throw std::runtime_error("Expected object");
         x.set_designation(j.at("designation").get<std::string>());
-        if (j.find("discovery_date") != j.end() && !std::regex_match(j.at("discovery_date").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("discovery_date") != j.end() && !std::regex_match(j.at("discovery_date").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_discovery_date(j.at("discovery_date").get<std::string>());
         if (j.find("h_mag") != j.end() && j.at("h_mag").is_null()) throw std::runtime_error("Unexpected null");
         x.set_h_mag(get_stack_optional<std::string>(j, "h_mag"));
diff --git a/base/cplusplus/test/inputs/json/misc/7f568.json/default/quicktype.hpp b/head/cplusplus/test/inputs/json/misc/7f568.json/default/quicktype.hpp
index db2a84a..817e96f 100644
--- a/base/cplusplus/test/inputs/json/misc/7f568.json/default/quicktype.hpp
+++ b/head/cplusplus/test/inputs/json/misc/7f568.json/default/quicktype.hpp
@@ -254,7 +254,7 @@ namespace quicktype {
         x.set_comments(j.at("comments").get<int64_t>());
         x.set_comments_url(j.at("comments_url").get<std::string>());
         x.set_commits_url(j.at("commits_url").get<std::string>());
-        if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_created_at(j.at("created_at").get<std::string>());
         j.at("description");
         x.set_description(get_stack_optional<std::string>(j, "description"));
@@ -266,7 +266,7 @@ namespace quicktype {
         x.set_id(j.at("id").get<std::string>());
         x.set_top_level_public(j.at("public").get<bool>());
         x.set_truncated(j.at("truncated").get<bool>());
-        if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_updated_at(j.at("updated_at").get<std::string>());
         x.set_url(j.at("url").get<std::string>());
         x.set_user(get_untyped(j, "user"));
diff --git a/base/cplusplus/test/inputs/json/misc/80aff.json/default/quicktype.hpp b/head/cplusplus/test/inputs/json/misc/80aff.json/default/quicktype.hpp
index 83e1c9b..50e3610 100644
--- a/base/cplusplus/test/inputs/json/misc/80aff.json/default/quicktype.hpp
+++ b/head/cplusplus/test/inputs/json/misc/80aff.json/default/quicktype.hpp
@@ -208,7 +208,7 @@ namespace quicktype {
 
     inline void from_json(const json & j, Result& x) {
         if (!j.is_object()) throw std::runtime_error("Expected object");
-        if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_created_at(j.at("created_at").get<std::string>());
         if (j.find("id") != j.end() && !j.at("id").is_number_integer()) throw std::runtime_error("Expected integer");
         x.set_id(j.at("id").get<int64_t>());
@@ -217,7 +217,7 @@ namespace quicktype {
         x.set_name(j.at("name").get<std::string>());
         j.at("parent");
         x.set_parent(get_stack_optional<int64_t>(j, "parent"));
-        if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_updated_at(j.at("updated_at").get<std::string>());
         x.set_uri(j.at("uri").get<std::string>());
     }
diff --git a/base/cplusplus/test/inputs/json/misc/88130.json/default/quicktype.hpp b/head/cplusplus/test/inputs/json/misc/88130.json/default/quicktype.hpp
index f3ba96d..bdbe623 100644
--- a/base/cplusplus/test/inputs/json/misc/88130.json/default/quicktype.hpp
+++ b/head/cplusplus/test/inputs/json/misc/88130.json/default/quicktype.hpp
@@ -711,7 +711,7 @@ namespace quicktype {
         if (!j.is_object()) throw std::runtime_error("Expected object");
         if (j.find("count") != j.end() && !j.at("count").is_number_integer()) throw std::runtime_error("Expected integer");
         x.set_count(j.at("count").get<int64_t>());
-        if (j.find("created") != j.end() && !std::regex_match(j.at("created").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("created") != j.end() && !std::regex_match(j.at("created").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_created(j.at("created").get<std::string>());
         x.set_lang(j.at("lang").get<std::string>());
         x.set_results(j.at("results").get<Results>());
diff --git a/base/cplusplus/test/inputs/json/misc/9929c.json/default/quicktype.hpp b/head/cplusplus/test/inputs/json/misc/9929c.json/default/quicktype.hpp
index f3ba96d..bdbe623 100644
--- a/base/cplusplus/test/inputs/json/misc/9929c.json/default/quicktype.hpp
+++ b/head/cplusplus/test/inputs/json/misc/9929c.json/default/quicktype.hpp
@@ -711,7 +711,7 @@ namespace quicktype {
         if (!j.is_object()) throw std::runtime_error("Expected object");
         if (j.find("count") != j.end() && !j.at("count").is_number_integer()) throw std::runtime_error("Expected integer");
         x.set_count(j.at("count").get<int64_t>());
-        if (j.find("created") != j.end() && !std::regex_match(j.at("created").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("created") != j.end() && !std::regex_match(j.at("created").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_created(j.at("created").get<std::string>());
         x.set_lang(j.at("lang").get<std::string>());
         x.set_results(j.at("results").get<Results>());
diff --git a/base/cplusplus/test/inputs/json/misc/9ac3b.json/default/quicktype.hpp b/head/cplusplus/test/inputs/json/misc/9ac3b.json/default/quicktype.hpp
index fafc445..bc4104a 100644
--- a/base/cplusplus/test/inputs/json/misc/9ac3b.json/default/quicktype.hpp
+++ b/head/cplusplus/test/inputs/json/misc/9ac3b.json/default/quicktype.hpp
@@ -237,7 +237,7 @@ namespace quicktype {
 
     inline void from_json(const json & j, Result& x) {
         if (!j.is_object()) throw std::runtime_error("Expected object");
-        if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_created_at(j.at("created_at").get<std::string>());
         x.set_entity(j.at("entity").get<std::string>());
         x.set_first_name(j.at("first_name").get<std::string>());
@@ -249,7 +249,7 @@ namespace quicktype {
         x.set_status(j.at("status").get<Status>());
         j.at("title");
         x.set_title(get_stack_optional<Title>(j, "title"));
-        if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_updated_at(j.at("updated_at").get<std::string>());
         x.set_uri(j.at("uri").get<std::string>());
     }
diff --git a/base/cplusplus/test/inputs/json/misc/a0496.json/default/quicktype.hpp b/head/cplusplus/test/inputs/json/misc/a0496.json/default/quicktype.hpp
index 2ee2f65..4156d69 100644
--- a/base/cplusplus/test/inputs/json/misc/a0496.json/default/quicktype.hpp
+++ b/head/cplusplus/test/inputs/json/misc/a0496.json/default/quicktype.hpp
@@ -239,7 +239,7 @@ namespace quicktype {
         x.set_source_name(j.at("source_name").get<std::string>());
         x.set_to_date(j.at("to_date").get<std::string>());
         x.set_type(j.at("type").get<std::string>());
-        if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_updated_at(j.at("updated_at").get<std::string>());
         x.set_urlize_name(j.at("urlize_name").get<std::string>());
     }
diff --git a/base/cplusplus/test/inputs/json/misc/a1eca.json/default/quicktype.hpp b/head/cplusplus/test/inputs/json/misc/a1eca.json/default/quicktype.hpp
index f3ba96d..bdbe623 100644
--- a/base/cplusplus/test/inputs/json/misc/a1eca.json/default/quicktype.hpp
+++ b/head/cplusplus/test/inputs/json/misc/a1eca.json/default/quicktype.hpp
@@ -711,7 +711,7 @@ namespace quicktype {
         if (!j.is_object()) throw std::runtime_error("Expected object");
         if (j.find("count") != j.end() && !j.at("count").is_number_integer()) throw std::runtime_error("Expected integer");
         x.set_count(j.at("count").get<int64_t>());
-        if (j.find("created") != j.end() && !std::regex_match(j.at("created").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("created") != j.end() && !std::regex_match(j.at("created").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_created(j.at("created").get<std::string>());
         x.set_lang(j.at("lang").get<std::string>());
         x.set_results(j.at("results").get<Results>());
diff --git a/base/cplusplus/test/inputs/json/misc/b4865.json/default/quicktype.hpp b/head/cplusplus/test/inputs/json/misc/b4865.json/default/quicktype.hpp
index 4558b85..75d0044 100644
--- a/base/cplusplus/test/inputs/json/misc/b4865.json/default/quicktype.hpp
+++ b/head/cplusplus/test/inputs/json/misc/b4865.json/default/quicktype.hpp
@@ -232,7 +232,7 @@ namespace quicktype {
         x.set_reclat(get_stack_optional<std::string>(j, "reclat"));
         if (j.find("reclong") != j.end() && j.at("reclong").is_null()) throw std::runtime_error("Unexpected null");
         x.set_reclong(get_stack_optional<std::string>(j, "reclong"));
-        if (j.find("year") != j.end() && !std::regex_match(j.at("year").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("year") != j.end() && !std::regex_match(j.at("year").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         if (j.find("year") != j.end() && j.at("year").is_null()) throw std::runtime_error("Unexpected null");
         x.set_year(get_stack_optional<std::string>(j, "year"));
     }
diff --git a/base/cplusplus/test/inputs/json/misc/cf0d8.json/default/quicktype.hpp b/head/cplusplus/test/inputs/json/misc/cf0d8.json/default/quicktype.hpp
index f3ba96d..bdbe623 100644
--- a/base/cplusplus/test/inputs/json/misc/cf0d8.json/default/quicktype.hpp
+++ b/head/cplusplus/test/inputs/json/misc/cf0d8.json/default/quicktype.hpp
@@ -711,7 +711,7 @@ namespace quicktype {
         if (!j.is_object()) throw std::runtime_error("Expected object");
         if (j.find("count") != j.end() && !j.at("count").is_number_integer()) throw std::runtime_error("Expected integer");
         x.set_count(j.at("count").get<int64_t>());
-        if (j.find("created") != j.end() && !std::regex_match(j.at("created").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("created") != j.end() && !std::regex_match(j.at("created").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_created(j.at("created").get<std::string>());
         x.set_lang(j.at("lang").get<std::string>());
         x.set_results(j.at("results").get<Results>());
diff --git a/base/cplusplus/test/inputs/json/misc/d23d5.json/default/quicktype.hpp b/head/cplusplus/test/inputs/json/misc/d23d5.json/default/quicktype.hpp
index 972f4e8..a2058cc 100644
--- a/base/cplusplus/test/inputs/json/misc/d23d5.json/default/quicktype.hpp
+++ b/head/cplusplus/test/inputs/json/misc/d23d5.json/default/quicktype.hpp
@@ -205,11 +205,11 @@ namespace quicktype {
         if (!j.is_object()) throw std::runtime_error("Expected object");
         j.at("acronym");
         x.set_acronym(get_stack_optional<std::string>(j, "acronym"));
-        if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_created_at(j.at("created_at").get<std::string>());
         x.set_id(j.at("id").get<std::string>());
         x.set_name(j.at("name").get<std::string>());
-        if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_updated_at(j.at("updated_at").get<std::string>());
         x.set_uri(j.at("uri").get<std::string>());
     }
diff --git a/base/cplusplus/test/inputs/json/misc/dbfb3.json/default/quicktype.hpp b/head/cplusplus/test/inputs/json/misc/dbfb3.json/default/quicktype.hpp
index a35bd4f..10d29ec 100644
--- a/base/cplusplus/test/inputs/json/misc/dbfb3.json/default/quicktype.hpp
+++ b/head/cplusplus/test/inputs/json/misc/dbfb3.json/default/quicktype.hpp
@@ -716,7 +716,7 @@ namespace quicktype {
         if (!j.is_object()) throw std::runtime_error("Expected object");
         if (j.find("count") != j.end() && !j.at("count").is_number_integer()) throw std::runtime_error("Expected integer");
         x.set_count(j.at("count").get<int64_t>());
-        if (j.find("created") != j.end() && !std::regex_match(j.at("created").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("created") != j.end() && !std::regex_match(j.at("created").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_created(j.at("created").get<std::string>());
         x.set_lang(j.at("lang").get<std::string>());
         x.set_results(j.at("results").get<Results>());
diff --git a/base/cplusplus/test/inputs/json/misc/df957.json/default/quicktype.hpp b/head/cplusplus/test/inputs/json/misc/df957.json/default/quicktype.hpp
index f3ba96d..bdbe623 100644
--- a/base/cplusplus/test/inputs/json/misc/df957.json/default/quicktype.hpp
+++ b/head/cplusplus/test/inputs/json/misc/df957.json/default/quicktype.hpp
@@ -711,7 +711,7 @@ namespace quicktype {
         if (!j.is_object()) throw std::runtime_error("Expected object");
         if (j.find("count") != j.end() && !j.at("count").is_number_integer()) throw std::runtime_error("Expected integer");
         x.set_count(j.at("count").get<int64_t>());
-        if (j.find("created") != j.end() && !std::regex_match(j.at("created").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("created") != j.end() && !std::regex_match(j.at("created").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_created(j.at("created").get<std::string>());
         x.set_lang(j.at("lang").get<std::string>());
         x.set_results(j.at("results").get<Results>());
diff --git a/base/cplusplus/test/inputs/json/misc/e2915.json/default/quicktype.hpp b/head/cplusplus/test/inputs/json/misc/e2915.json/default/quicktype.hpp
index 78e3b7c..83d3598 100644
--- a/base/cplusplus/test/inputs/json/misc/e2915.json/default/quicktype.hpp
+++ b/head/cplusplus/test/inputs/json/misc/e2915.json/default/quicktype.hpp
@@ -716,7 +716,7 @@ namespace quicktype {
         if (!j.is_object()) throw std::runtime_error("Expected object");
         if (j.find("count") != j.end() && !j.at("count").is_number_integer()) throw std::runtime_error("Expected integer");
         x.set_count(j.at("count").get<int64_t>());
-        if (j.find("created") != j.end() && !std::regex_match(j.at("created").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("created") != j.end() && !std::regex_match(j.at("created").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_created(j.at("created").get<std::string>());
         x.set_lang(j.at("lang").get<std::string>());
         x.set_results(j.at("results").get<Results>());
diff --git a/base/cplusplus/test/inputs/json/priority/bug2663.json/default/quicktype.hpp b/head/cplusplus/test/inputs/json/priority/bug2663.json/default/quicktype.hpp
index 9a2b953..d83bc52 100644
--- a/base/cplusplus/test/inputs/json/priority/bug2663.json/default/quicktype.hpp
+++ b/head/cplusplus/test/inputs/json/priority/bug2663.json/default/quicktype.hpp
@@ -63,7 +63,7 @@ namespace quicktype {
     inline void from_json(const json & j, TopLevel& x) {
         if (!j.is_object()) throw std::runtime_error("Expected object");
         x.set_birthday(j.at("birthday").get<std::string>());
-        if (j.find("lastSeen") != j.end() && !std::regex_match(j.at("lastSeen").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("lastSeen") != j.end() && !std::regex_match(j.at("lastSeen").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_last_seen(j.at("lastSeen").get<std::string>());
         x.set_name(j.at("name").get<std::string>());
     }
diff --git a/base/cplusplus/test/inputs/json/priority/keywords.json/default/quicktype.hpp b/head/cplusplus/test/inputs/json/priority/keywords.json/default/quicktype.hpp
index a810ee5..f181112 100644
--- a/base/cplusplus/test/inputs/json/priority/keywords.json/default/quicktype.hpp
+++ b/head/cplusplus/test/inputs/json/priority/keywords.json/default/quicktype.hpp
@@ -8380,7 +8380,7 @@ namespace quicktype {
 
     inline void from_json(const json & j, DateTime& x) {
         if (!j.is_object()) throw std::runtime_error("Expected object");
-        if (j.find("DateTime") != j.end() && !std::regex_match(j.at("DateTime").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("DateTime") != j.end() && !std::regex_match(j.at("DateTime").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_date_time(j.at("DateTime").get<std::string>());
     }
 
diff --git a/base/cplusplus/test/inputs/json/samples/github-events.json/default/quicktype.hpp b/head/cplusplus/test/inputs/json/samples/github-events.json/default/quicktype.hpp
index e0131ae..e1e2835 100644
--- a/base/cplusplus/test/inputs/json/samples/github-events.json/default/quicktype.hpp
+++ b/head/cplusplus/test/inputs/json/samples/github-events.json/default/quicktype.hpp
@@ -1541,13 +1541,13 @@ namespace quicktype {
     inline void from_json(const json & j, Comment& x) {
         if (!j.is_object()) throw std::runtime_error("Expected object");
         x.set_body(j.at("body").get<std::string>());
-        if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_created_at(j.at("created_at").get<std::string>());
         x.set_html_url(j.at("html_url").get<std::string>());
         if (j.find("id") != j.end() && !j.at("id").is_number_integer()) throw std::runtime_error("Expected integer");
         x.set_id(j.at("id").get<int64_t>());
         x.set_issue_url(j.at("issue_url").get<std::string>());
-        if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_updated_at(j.at("updated_at").get<std::string>());
         x.set_url(j.at("url").get<std::string>());
         x.set_user(j.at("user").get<User>());
@@ -1619,7 +1619,7 @@ namespace quicktype {
         x.set_closed_at(get_untyped(j, "closed_at"));
         if (j.find("closed_issues") != j.end() && !j.at("closed_issues").is_number_integer()) throw std::runtime_error("Expected integer");
         x.set_closed_issues(j.at("closed_issues").get<int64_t>());
-        if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_created_at(j.at("created_at").get<std::string>());
         x.set_creator(j.at("creator").get<User>());
         x.set_description(j.at("description").get<std::string>());
@@ -1635,7 +1635,7 @@ namespace quicktype {
         x.set_open_issues(j.at("open_issues").get<int64_t>());
         x.set_state(j.at("state").get<std::string>());
         x.set_title(j.at("title").get<std::string>());
-        if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_updated_at(j.at("updated_at").get<std::string>());
         x.set_url(j.at("url").get<std::string>());
     }
@@ -1685,7 +1685,7 @@ namespace quicktype {
         if (j.find("comments") != j.end() && !j.at("comments").is_number_integer()) throw std::runtime_error("Expected integer");
         x.set_comments(j.at("comments").get<int64_t>());
         x.set_comments_url(j.at("comments_url").get<std::string>());
-        if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_created_at(j.at("created_at").get<std::string>());
         x.set_events_url(j.at("events_url").get<std::string>());
         x.set_html_url(j.at("html_url").get<std::string>());
@@ -1703,7 +1703,7 @@ namespace quicktype {
         x.set_repository_url(j.at("repository_url").get<std::string>());
         x.set_state(j.at("state").get<std::string>());
         x.set_title(j.at("title").get<std::string>());
-        if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_updated_at(j.at("updated_at").get<std::string>());
         x.set_url(j.at("url").get<std::string>());
         x.set_user(j.at("user").get<User>());
@@ -1748,7 +1748,7 @@ namespace quicktype {
         x.set_compare_url(j.at("compare_url").get<std::string>());
         x.set_contents_url(j.at("contents_url").get<std::string>());
         x.set_contributors_url(j.at("contributors_url").get<std::string>());
-        if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_created_at(j.at("created_at").get<std::string>());
         x.set_default_branch(j.at("default_branch").get<std::string>());
         x.set_deployments_url(j.at("deployments_url").get<std::string>());
@@ -1794,7 +1794,7 @@ namespace quicktype {
         x.set_open_issues_count(j.at("open_issues_count").get<int64_t>());
         x.set_owner(j.at("owner").get<User>());
         x.set_pulls_url(j.at("pulls_url").get<std::string>());
-        if (j.find("pushed_at") != j.end() && !std::regex_match(j.at("pushed_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("pushed_at") != j.end() && !std::regex_match(j.at("pushed_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_pushed_at(j.at("pushed_at").get<std::string>());
         x.set_releases_url(j.at("releases_url").get<std::string>());
         x.set_repo_private(j.at("private").get<bool>());
@@ -1811,7 +1811,7 @@ namespace quicktype {
         x.set_tags_url(j.at("tags_url").get<std::string>());
         x.set_teams_url(j.at("teams_url").get<std::string>());
         x.set_trees_url(j.at("trees_url").get<std::string>());
-        if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_updated_at(j.at("updated_at").get<std::string>());
         x.set_url(j.at("url").get<std::string>());
         if (j.find("watchers") != j.end() && !j.at("watchers").is_number_integer()) throw std::runtime_error("Expected integer");
@@ -1955,7 +1955,7 @@ namespace quicktype {
         x.set_body(j.at("body").get<std::string>());
         if (j.find("changed_files") != j.end() && !j.at("changed_files").is_number_integer()) throw std::runtime_error("Expected integer");
         x.set_changed_files(j.at("changed_files").get<int64_t>());
-        if (j.find("closed_at") != j.end() && !std::regex_match(j.at("closed_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("closed_at") != j.end() && !std::regex_match(j.at("closed_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_closed_at(j.at("closed_at").get<std::string>());
         if (j.find("comments") != j.end() && !j.at("comments").is_number_integer()) throw std::runtime_error("Expected integer");
         x.set_comments(j.at("comments").get<int64_t>());
@@ -1963,7 +1963,7 @@ namespace quicktype {
         if (j.find("commits") != j.end() && !j.at("commits").is_number_integer()) throw std::runtime_error("Expected integer");
         x.set_commits(j.at("commits").get<int64_t>());
         x.set_commits_url(j.at("commits_url").get<std::string>());
-        if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_created_at(j.at("created_at").get<std::string>());
         if (j.find("deletions") != j.end() && !j.at("deletions").is_number_integer()) throw std::runtime_error("Expected integer");
         x.set_deletions(j.at("deletions").get<int64_t>());
@@ -1980,7 +1980,7 @@ namespace quicktype {
         x.set_mergeable(get_untyped(j, "mergeable"));
         x.set_mergeable_state(j.at("mergeable_state").get<std::string>());
         x.set_merged(j.at("merged").get<bool>());
-        if (j.find("merged_at") != j.end() && !std::regex_match(j.at("merged_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("merged_at") != j.end() && !std::regex_match(j.at("merged_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_merged_at(j.at("merged_at").get<std::string>());
         x.set_merged_by(j.at("merged_by").get<User>());
         x.set_milestone(get_untyped(j, "milestone"));
@@ -1996,7 +1996,7 @@ namespace quicktype {
         x.set_state(j.at("state").get<std::string>());
         x.set_statuses_url(j.at("statuses_url").get<std::string>());
         x.set_title(j.at("title").get<std::string>());
-        if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("updated_at") != j.end() && !std::regex_match(j.at("updated_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_updated_at(j.at("updated_at").get<std::string>());
         x.set_url(j.at("url").get<std::string>());
         x.set_user(j.at("user").get<User>());
@@ -2125,7 +2125,7 @@ namespace quicktype {
     inline void from_json(const json & j, TopLevelElement& x) {
         if (!j.is_object()) throw std::runtime_error("Expected object");
         x.set_actor(j.at("actor").get<Actor>());
-        if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_created_at(j.at("created_at").get<std::string>());
         x.set_id(j.at("id").get<std::string>());
         if (j.find("org") != j.end() && j.at("org").is_null()) throw std::runtime_error("Unexpected null");
diff --git a/base/cplusplus/test/inputs/json/samples/null-safe.json/default/quicktype.hpp b/head/cplusplus/test/inputs/json/samples/null-safe.json/default/quicktype.hpp
index 0ec5118..b43997d 100644
--- a/base/cplusplus/test/inputs/json/samples/null-safe.json/default/quicktype.hpp
+++ b/head/cplusplus/test/inputs/json/samples/null-safe.json/default/quicktype.hpp
@@ -183,7 +183,7 @@ namespace quicktype {
         if (!j.is_object()) throw std::runtime_error("Expected object");
         if (j.find("address") != j.end() && j.at("address").is_null()) throw std::runtime_error("Unexpected null");
         x.set_address(get_stack_optional<Address>(j, "address"));
-        if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("created_at") != j.end() && !std::regex_match(j.at("created_at").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         if (j.find("created_at") != j.end() && j.at("created_at").is_null()) throw std::runtime_error("Unexpected null");
         x.set_created_at(get_stack_optional<std::string>(j, "created_at"));
         x.set_name(j.at("name").get<std::string>());
diff --git a/base/objective-c/test/inputs/json/misc/0a358.json/default/QTTopLevel.m b/head/objective-c/test/inputs/json/misc/0a358.json/default/QTTopLevel.m
index 8af9d9b..952b27b 100644
--- a/base/objective-c/test/inputs/json/misc/0a358.json/default/QTTopLevel.m
+++ b/head/objective-c/test/inputs/json/misc/0a358.json/default/QTTopLevel.m
@@ -228,12 +228,14 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
 {
     if (self = [super init]) {
         if (![dict[@"code"] isKindOfClass:NSString.class]) return nil;
-        if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created_at"] substringToIndex:10]]) return nil;
         if (![dict[@"created_at"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"id"] isKindOfClass:NSNumber.class]) return nil;
         if ([dict[@"id"] doubleValue] != [dict[@"id"] longLongValue]) return nil;
         if (![dict[@"name"] isKindOfClass:NSString.class]) return nil;
-        if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"updated_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"updated_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"updated_at"] substringToIndex:10]]) return nil;
         if (![dict[@"updated_at"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"uri"] isKindOfClass:NSString.class]) return nil;
         [self setValuesForKeysWithDictionary:dict];
diff --git a/base/objective-c/test/inputs/json/misc/0a91a.json/default/QTTopLevel.m b/head/objective-c/test/inputs/json/misc/0a91a.json/default/QTTopLevel.m
index 5b754de..6c1a7e0 100644
--- a/base/objective-c/test/inputs/json/misc/0a91a.json/default/QTTopLevel.m
+++ b/head/objective-c/test/inputs/json/misc/0a91a.json/default/QTTopLevel.m
@@ -175,7 +175,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
 {
     if (self = [super init]) {
         if (![dict[@"actor"] isKindOfClass:NSDictionary.class]) return nil;
-        if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created_at"] substringToIndex:10]]) return nil;
         if (![dict[@"created_at"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"id"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"public"] isKindOfClass:NSNumber.class]) return nil;
@@ -539,7 +540,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
         if (![dict[@"body"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"changed_files"] isKindOfClass:NSNumber.class]) return nil;
         if ([dict[@"changed_files"] doubleValue] != [dict[@"changed_files"] longLongValue]) return nil;
-        if (dict[@"closed_at"] && [dict[@"closed_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"closed_at"] && [dict[@"closed_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"closed_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"closed_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"closed_at"] substringToIndex:10]]) return nil;
         if (![dict[@"closed_at"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"comments"] isKindOfClass:NSNumber.class]) return nil;
         if ([dict[@"comments"] doubleValue] != [dict[@"comments"] longLongValue]) return nil;
@@ -547,7 +549,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
         if (![dict[@"commits"] isKindOfClass:NSNumber.class]) return nil;
         if ([dict[@"commits"] doubleValue] != [dict[@"commits"] longLongValue]) return nil;
         if (![dict[@"commits_url"] isKindOfClass:NSString.class]) return nil;
-        if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created_at"] substringToIndex:10]]) return nil;
         if (![dict[@"created_at"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"deletions"] isKindOfClass:NSNumber.class]) return nil;
         if ([dict[@"deletions"] doubleValue] != [dict[@"deletions"] longLongValue]) return nil;
@@ -564,7 +567,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
         if (![dict[@"merge_commit_sha"] isKindOfClass:NSString.class]) return nil;
         if (!dict[@"mergeable"]) return nil;
         if (![dict[@"mergeable_state"] isKindOfClass:NSString.class]) return nil;
-        if (dict[@"merged_at"] && [dict[@"merged_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"merged_at"] && [dict[@"merged_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"merged_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"merged_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"merged_at"] substringToIndex:10]]) return nil;
         if (![dict[@"merged_at"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"merged_by"] isKindOfClass:NSDictionary.class]) return nil;
         if (!dict[@"milestone"]) return nil;
@@ -580,7 +584,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
         if (![dict[@"state"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"statuses_url"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"title"] isKindOfClass:NSString.class]) return nil;
-        if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"updated_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"updated_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"updated_at"] substringToIndex:10]]) return nil;
         if (![dict[@"updated_at"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"url"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"user"] isKindOfClass:NSDictionary.class]) return nil;
@@ -794,7 +799,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
         if (![dict[@"compare_url"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"contents_url"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"contributors_url"] isKindOfClass:NSString.class]) return nil;
-        if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created_at"] substringToIndex:10]]) return nil;
         if (![dict[@"created_at"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"default_branch"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"deployments_url"] isKindOfClass:NSString.class]) return nil;
@@ -840,7 +846,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
         if ([dict[@"open_issues_count"] doubleValue] != [dict[@"open_issues_count"] longLongValue]) return nil;
         if (![dict[@"owner"] isKindOfClass:NSDictionary.class]) return nil;
         if (![dict[@"pulls_url"] isKindOfClass:NSString.class]) return nil;
-        if (dict[@"pushed_at"] && [dict[@"pushed_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"pushed_at"] && [dict[@"pushed_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"pushed_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"pushed_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"pushed_at"] substringToIndex:10]]) return nil;
         if (![dict[@"pushed_at"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"releases_url"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"size"] isKindOfClass:NSNumber.class]) return nil;
@@ -857,7 +864,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
         if (![dict[@"teams_url"] isKindOfClass:NSString.class]) return nil;
         if (!dict[@"description"]) return nil;
         if (![dict[@"trees_url"] isKindOfClass:NSString.class]) return nil;
-        if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"updated_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"updated_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"updated_at"] substringToIndex:10]]) return nil;
         if (![dict[@"updated_at"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"url"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"watchers"] isKindOfClass:NSNumber.class]) return nil;
diff --git a/base/objective-c/test/inputs/json/misc/16bc5.json/default/QTTopLevel.m b/head/objective-c/test/inputs/json/misc/16bc5.json/default/QTTopLevel.m
index e85afe8..ea30c5a 100644
--- a/base/objective-c/test/inputs/json/misc/16bc5.json/default/QTTopLevel.m
+++ b/head/objective-c/test/inputs/json/misc/16bc5.json/default/QTTopLevel.m
@@ -217,7 +217,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
     if (self = [super init]) {
         if (![dict[@"count"] isKindOfClass:NSNumber.class]) return nil;
         if ([dict[@"count"] doubleValue] != [dict[@"count"] longLongValue]) return nil;
-        if (dict[@"created"] && [dict[@"created"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created"] && [dict[@"created"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created"] substringToIndex:10]]) return nil;
         if (![dict[@"created"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"lang"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"results"] isKindOfClass:NSDictionary.class]) return nil;
diff --git a/base/objective-c/test/inputs/json/misc/262f0.json/default/QTTopLevel.m b/head/objective-c/test/inputs/json/misc/262f0.json/default/QTTopLevel.m
index 5045c66..17f7fc5 100644
--- a/base/objective-c/test/inputs/json/misc/262f0.json/default/QTTopLevel.m
+++ b/head/objective-c/test/inputs/json/misc/262f0.json/default/QTTopLevel.m
@@ -246,7 +246,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
     if (self = [super init]) {
         if (![dict[@"count"] isKindOfClass:NSNumber.class]) return nil;
         if ([dict[@"count"] doubleValue] != [dict[@"count"] longLongValue]) return nil;
-        if (dict[@"created"] && [dict[@"created"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created"] && [dict[@"created"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created"] substringToIndex:10]]) return nil;
         if (![dict[@"created"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"lang"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"results"] isKindOfClass:NSDictionary.class]) return nil;
diff --git a/base/objective-c/test/inputs/json/misc/337ed.json/default/QTTopLevel.m b/head/objective-c/test/inputs/json/misc/337ed.json/default/QTTopLevel.m
index f604dbc..5a67bf0 100644
--- a/base/objective-c/test/inputs/json/misc/337ed.json/default/QTTopLevel.m
+++ b/head/objective-c/test/inputs/json/misc/337ed.json/default/QTTopLevel.m
@@ -344,12 +344,14 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
         if (!dict[@"cost_absolute"]) return nil;
         if (!dict[@"cost_max"]) return nil;
         if (!dict[@"cost_min"]) return nil;
-        if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created_at"] substringToIndex:10]]) return nil;
         if (![dict[@"created_at"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"customIncomes"] isKindOfClass:NSArray.class]) return nil;
         if (!dict[@"direct_rep_costs_max"]) return nil;
         if (!dict[@"direct_rep_costs_min"]) return nil;
-        if (dict[@"end_date"] && [dict[@"end_date"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"end_date"] && [dict[@"end_date"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"end_date"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"end_date"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"end_date"] substringToIndex:10]]) return nil;
         if (![dict[@"end_date"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"eur_sources_grants"] isKindOfClass:NSNumber.class]) return nil;
         if ([dict[@"eur_sources_grants"] doubleValue] != [dict[@"eur_sources_grants"] longLongValue]) return nil;
@@ -367,7 +369,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
         if (!dict[@"public_financing_national"]) return nil;
         if (!dict[@"public_financing_total"]) return nil;
         if (![dict[@"representative"] isKindOfClass:NSString.class]) return nil;
-        if (dict[@"start_date"] && [dict[@"start_date"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"start_date"] && [dict[@"start_date"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"start_date"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"start_date"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"start_date"] substringToIndex:10]]) return nil;
         if (![dict[@"start_date"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"status"] isKindOfClass:NSString.class]) return nil;
         if (!dict[@"new_organisation"]) return nil;
@@ -376,7 +379,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
         if (!dict[@"turnover_max"]) return nil;
         if (!dict[@"turnover_min"]) return nil;
         if (![dict[@"type"] isKindOfClass:NSString.class]) return nil;
-        if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"updated_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"updated_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"updated_at"] substringToIndex:10]]) return nil;
         if (![dict[@"updated_at"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"uri"] isKindOfClass:NSString.class]) return nil;
         [self setValuesForKeysWithDictionary:dict];
@@ -447,13 +451,15 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
     if (self = [super init]) {
         if (![dict[@"amount"] isKindOfClass:NSNumber.class]) return nil;
         if ([dict[@"amount"] doubleValue] != [dict[@"amount"] longLongValue]) return nil;
-        if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created_at"] substringToIndex:10]]) return nil;
         if (![dict[@"created_at"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"id"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"name"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"status"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"type"] isKindOfClass:NSString.class]) return nil;
-        if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"updated_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"updated_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"updated_at"] substringToIndex:10]]) return nil;
         if (![dict[@"updated_at"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"uri"] isKindOfClass:NSString.class]) return nil;
         [self setValuesForKeysWithDictionary:dict];
diff --git a/base/objective-c/test/inputs/json/misc/3f1ce.json/default/QTTopLevel.m b/head/objective-c/test/inputs/json/misc/3f1ce.json/default/QTTopLevel.m
index e01ac72..53d8507 100644
--- a/base/objective-c/test/inputs/json/misc/3f1ce.json/default/QTTopLevel.m
+++ b/head/objective-c/test/inputs/json/misc/3f1ce.json/default/QTTopLevel.m
@@ -242,7 +242,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
     if (self = [super init]) {
         if (![dict[@"count"] isKindOfClass:NSNumber.class]) return nil;
         if ([dict[@"count"] doubleValue] != [dict[@"count"] longLongValue]) return nil;
-        if (dict[@"created"] && [dict[@"created"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created"] && [dict[@"created"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created"] substringToIndex:10]]) return nil;
         if (![dict[@"created"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"lang"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"results"] isKindOfClass:NSDictionary.class]) return nil;
diff --git a/base/objective-c/test/inputs/json/misc/4c547.json/default/QTTopLevel.m b/head/objective-c/test/inputs/json/misc/4c547.json/default/QTTopLevel.m
index e85afe8..ea30c5a 100644
--- a/base/objective-c/test/inputs/json/misc/4c547.json/default/QTTopLevel.m
+++ b/head/objective-c/test/inputs/json/misc/4c547.json/default/QTTopLevel.m
@@ -217,7 +217,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
     if (self = [super init]) {
         if (![dict[@"count"] isKindOfClass:NSNumber.class]) return nil;
         if ([dict[@"count"] doubleValue] != [dict[@"count"] longLongValue]) return nil;
-        if (dict[@"created"] && [dict[@"created"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created"] && [dict[@"created"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created"] substringToIndex:10]]) return nil;
         if (![dict[@"created"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"lang"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"results"] isKindOfClass:NSDictionary.class]) return nil;
diff --git a/base/objective-c/test/inputs/json/misc/54d32.json/default/QTTopLevel.m b/head/objective-c/test/inputs/json/misc/54d32.json/default/QTTopLevel.m
index 5f08b28..42e0a08 100644
--- a/base/objective-c/test/inputs/json/misc/54d32.json/default/QTTopLevel.m
+++ b/head/objective-c/test/inputs/json/misc/54d32.json/default/QTTopLevel.m
@@ -254,13 +254,15 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
 - (instancetype)initWithJSONDictionary:(NSDictionary *)dict
 {
     if (self = [super init]) {
-        if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created_at"] substringToIndex:10]]) return nil;
         if (![dict[@"created_at"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"id"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"person_id"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"representative_id"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"status"] isKindOfClass:NSString.class]) return nil;
-        if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"updated_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"updated_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"updated_at"] substringToIndex:10]]) return nil;
         if (![dict[@"updated_at"] isKindOfClass:NSString.class]) return nil;
         [self setValuesForKeysWithDictionary:dict];
         _status = [QTStatus withValue:(id)_status];
diff --git a/base/objective-c/test/inputs/json/misc/5eae5.json/default/QTTopLevel.m b/head/objective-c/test/inputs/json/misc/5eae5.json/default/QTTopLevel.m
index 8181aae..02b5657 100644
--- a/base/objective-c/test/inputs/json/misc/5eae5.json/default/QTTopLevel.m
+++ b/head/objective-c/test/inputs/json/misc/5eae5.json/default/QTTopLevel.m
@@ -82,7 +82,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
 - (instancetype)initWithJSONDictionary:(NSDictionary *)dict
 {
     if (self = [super init]) {
-        if (dict[@"Date"] && [dict[@"Date"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"Date"] && [dict[@"Date"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"Date"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"Date"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"Date"] substringToIndex:10]]) return nil;
         if (![dict[@"Date"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"ID"] isKindOfClass:NSNumber.class]) return nil;
         if ([dict[@"ID"] doubleValue] != [dict[@"ID"] longLongValue]) return nil;
diff --git a/base/objective-c/test/inputs/json/misc/6dec6.json/default/QTTopLevel.m b/head/objective-c/test/inputs/json/misc/6dec6.json/default/QTTopLevel.m
index 7d53653..0e9fd56 100644
--- a/base/objective-c/test/inputs/json/misc/6dec6.json/default/QTTopLevel.m
+++ b/head/objective-c/test/inputs/json/misc/6dec6.json/default/QTTopLevel.m
@@ -246,7 +246,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
     if (self = [super init]) {
         if (![dict[@"count"] isKindOfClass:NSNumber.class]) return nil;
         if ([dict[@"count"] doubleValue] != [dict[@"count"] longLongValue]) return nil;
-        if (dict[@"created"] && [dict[@"created"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created"] && [dict[@"created"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created"] substringToIndex:10]]) return nil;
         if (![dict[@"created"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"lang"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"results"] isKindOfClass:NSDictionary.class]) return nil;
diff --git a/base/objective-c/test/inputs/json/misc/734ad.json/default/QTTopLevel.m b/head/objective-c/test/inputs/json/misc/734ad.json/default/QTTopLevel.m
index a82bbd0..77d47d1 100644
--- a/base/objective-c/test/inputs/json/misc/734ad.json/default/QTTopLevel.m
+++ b/head/objective-c/test/inputs/json/misc/734ad.json/default/QTTopLevel.m
@@ -318,7 +318,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
         if (![dict[@"code_of_conduct"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"contact_country"] isKindOfClass:NSNumber.class]) return nil;
         if ([dict[@"contact_country"] doubleValue] != [dict[@"contact_country"] longLongValue]) return nil;
-        if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created_at"] substringToIndex:10]]) return nil;
         if (![dict[@"created_at"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"entity"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"goals"] isKindOfClass:NSString.class]) return nil;
@@ -334,7 +335,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
         if (![dict[@"identification_code"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"id"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"info_members"] isKindOfClass:NSString.class]) return nil;
-        if (dict[@"last_update_date"] && [dict[@"last_update_date"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"last_update_date"] && [dict[@"last_update_date"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"last_update_date"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"last_update_date"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"last_update_date"] substringToIndex:10]]) return nil;
         if (![dict[@"last_update_date"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"legal"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"legal_status"] isKindOfClass:NSString.class]) return nil;
@@ -353,14 +355,16 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
         if (!dict[@"networking"]) return nil;
         if (!dict[@"number_of_natural_persons"]) return nil;
         if (!dict[@"other_code_of_conduct"]) return nil;
-        if (dict[@"registration_date"] && [dict[@"registration_date"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"registration_date"] && [dict[@"registration_date"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"registration_date"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"registration_date"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"registration_date"] substringToIndex:10]]) return nil;
         if (![dict[@"registration_date"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"status"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"structure_members"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"sub_category"] isKindOfClass:NSNumber.class]) return nil;
         if ([dict[@"sub_category"] doubleValue] != [dict[@"sub_category"] longLongValue]) return nil;
         if (![dict[@"sub_category_title"] isKindOfClass:NSString.class]) return nil;
-        if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"updated_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"updated_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"updated_at"] substringToIndex:10]]) return nil;
         if (![dict[@"updated_at"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"uri"] isKindOfClass:NSString.class]) return nil;
         if (!dict[@"web_site_url"]) return nil;
diff --git a/base/objective-c/test/inputs/json/misc/77392.json/default/QTTopLevel.m b/head/objective-c/test/inputs/json/misc/77392.json/default/QTTopLevel.m
index 62d5db5..4ed683d 100644
--- a/base/objective-c/test/inputs/json/misc/77392.json/default/QTTopLevel.m
+++ b/head/objective-c/test/inputs/json/misc/77392.json/default/QTTopLevel.m
@@ -159,7 +159,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
 {
     if (self = [super init]) {
         if (![dict[@"designation"] isKindOfClass:NSString.class]) return nil;
-        if (dict[@"discovery_date"] && [dict[@"discovery_date"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"discovery_date"] && [dict[@"discovery_date"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"discovery_date"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"discovery_date"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"discovery_date"] substringToIndex:10]]) return nil;
         if (![dict[@"discovery_date"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"i_deg"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"moid_au"] isKindOfClass:NSString.class]) return nil;
diff --git a/base/objective-c/test/inputs/json/misc/7f568.json/default/QTTopLevel.m b/head/objective-c/test/inputs/json/misc/7f568.json/default/QTTopLevel.m
index 6fb560b..e108e2e 100644
--- a/base/objective-c/test/inputs/json/misc/7f568.json/default/QTTopLevel.m
+++ b/head/objective-c/test/inputs/json/misc/7f568.json/default/QTTopLevel.m
@@ -153,7 +153,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
         if ([dict[@"comments"] doubleValue] != [dict[@"comments"] longLongValue]) return nil;
         if (![dict[@"comments_url"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"commits_url"] isKindOfClass:NSString.class]) return nil;
-        if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created_at"] substringToIndex:10]]) return nil;
         if (![dict[@"created_at"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"files"] isKindOfClass:NSDictionary.class]) return nil;
         if (![dict[@"forks_url"] isKindOfClass:NSString.class]) return nil;
@@ -164,7 +165,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
         if (![dict[@"public"] isKindOfClass:NSNumber.class]) return nil;
         if (![dict[@"truncated"] isKindOfClass:NSNumber.class]) return nil;
         if (!dict[@"description"]) return nil;
-        if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"updated_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"updated_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"updated_at"] substringToIndex:10]]) return nil;
         if (![dict[@"updated_at"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"url"] isKindOfClass:NSString.class]) return nil;
         if (!dict[@"user"]) return nil;
diff --git a/base/objective-c/test/inputs/json/misc/80aff.json/default/QTTopLevel.m b/head/objective-c/test/inputs/json/misc/80aff.json/default/QTTopLevel.m
index 42abd39..fbe7909 100644
--- a/base/objective-c/test/inputs/json/misc/80aff.json/default/QTTopLevel.m
+++ b/head/objective-c/test/inputs/json/misc/80aff.json/default/QTTopLevel.m
@@ -229,7 +229,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
 - (instancetype)initWithJSONDictionary:(NSDictionary *)dict
 {
     if (self = [super init]) {
-        if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created_at"] substringToIndex:10]]) return nil;
         if (![dict[@"created_at"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"id"] isKindOfClass:NSNumber.class]) return nil;
         if ([dict[@"id"] doubleValue] != [dict[@"id"] longLongValue]) return nil;
@@ -237,7 +238,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
         if ([dict[@"items"] doubleValue] != [dict[@"items"] longLongValue]) return nil;
         if (![dict[@"name"] isKindOfClass:NSString.class]) return nil;
         if (!dict[@"parent"]) return nil;
-        if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"updated_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"updated_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"updated_at"] substringToIndex:10]]) return nil;
         if (![dict[@"updated_at"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"uri"] isKindOfClass:NSString.class]) return nil;
         [self setValuesForKeysWithDictionary:dict];
diff --git a/base/objective-c/test/inputs/json/misc/88130.json/default/QTTopLevel.m b/head/objective-c/test/inputs/json/misc/88130.json/default/QTTopLevel.m
index e85afe8..ea30c5a 100644
--- a/base/objective-c/test/inputs/json/misc/88130.json/default/QTTopLevel.m
+++ b/head/objective-c/test/inputs/json/misc/88130.json/default/QTTopLevel.m
@@ -217,7 +217,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
     if (self = [super init]) {
         if (![dict[@"count"] isKindOfClass:NSNumber.class]) return nil;
         if ([dict[@"count"] doubleValue] != [dict[@"count"] longLongValue]) return nil;
-        if (dict[@"created"] && [dict[@"created"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created"] && [dict[@"created"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created"] substringToIndex:10]]) return nil;
         if (![dict[@"created"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"lang"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"results"] isKindOfClass:NSDictionary.class]) return nil;
diff --git a/base/objective-c/test/inputs/json/misc/9929c.json/default/QTTopLevel.m b/head/objective-c/test/inputs/json/misc/9929c.json/default/QTTopLevel.m
index e85afe8..ea30c5a 100644
--- a/base/objective-c/test/inputs/json/misc/9929c.json/default/QTTopLevel.m
+++ b/head/objective-c/test/inputs/json/misc/9929c.json/default/QTTopLevel.m
@@ -217,7 +217,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
     if (self = [super init]) {
         if (![dict[@"count"] isKindOfClass:NSNumber.class]) return nil;
         if ([dict[@"count"] doubleValue] != [dict[@"count"] longLongValue]) return nil;
-        if (dict[@"created"] && [dict[@"created"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created"] && [dict[@"created"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created"] substringToIndex:10]]) return nil;
         if (![dict[@"created"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"lang"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"results"] isKindOfClass:NSDictionary.class]) return nil;
diff --git a/base/objective-c/test/inputs/json/misc/9ac3b.json/default/QTTopLevel.m b/head/objective-c/test/inputs/json/misc/9ac3b.json/default/QTTopLevel.m
index 92de70d..49080ef 100644
--- a/base/objective-c/test/inputs/json/misc/9ac3b.json/default/QTTopLevel.m
+++ b/head/objective-c/test/inputs/json/misc/9ac3b.json/default/QTTopLevel.m
@@ -286,7 +286,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
 - (instancetype)initWithJSONDictionary:(NSDictionary *)dict
 {
     if (self = [super init]) {
-        if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created_at"] substringToIndex:10]]) return nil;
         if (![dict[@"created_at"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"entity"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"first_name"] isKindOfClass:NSString.class]) return nil;
@@ -296,7 +297,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
         if (!dict[@"position"]) return nil;
         if (![dict[@"status"] isKindOfClass:NSString.class]) return nil;
         if (!dict[@"title"]) return nil;
-        if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"updated_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"updated_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"updated_at"] substringToIndex:10]]) return nil;
         if (![dict[@"updated_at"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"uri"] isKindOfClass:NSString.class]) return nil;
         [self setValuesForKeysWithDictionary:dict];
diff --git a/base/objective-c/test/inputs/json/misc/a0496.json/default/QTTopLevel.m b/head/objective-c/test/inputs/json/misc/a0496.json/default/QTTopLevel.m
index e6753e0..744777e 100644
--- a/base/objective-c/test/inputs/json/misc/a0496.json/default/QTTopLevel.m
+++ b/head/objective-c/test/inputs/json/misc/a0496.json/default/QTTopLevel.m
@@ -125,7 +125,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
         if (![dict[@"description"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"to_date"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"type"] isKindOfClass:NSString.class]) return nil;
-        if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"updated_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"updated_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"updated_at"] substringToIndex:10]]) return nil;
         if (![dict[@"updated_at"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"urlize_name"] isKindOfClass:NSString.class]) return nil;
         [self setValuesForKeysWithDictionary:dict];
diff --git a/base/objective-c/test/inputs/json/misc/a1eca.json/default/QTTopLevel.m b/head/objective-c/test/inputs/json/misc/a1eca.json/default/QTTopLevel.m
index e85afe8..ea30c5a 100644
--- a/base/objective-c/test/inputs/json/misc/a1eca.json/default/QTTopLevel.m
+++ b/head/objective-c/test/inputs/json/misc/a1eca.json/default/QTTopLevel.m
@@ -217,7 +217,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
     if (self = [super init]) {
         if (![dict[@"count"] isKindOfClass:NSNumber.class]) return nil;
         if ([dict[@"count"] doubleValue] != [dict[@"count"] longLongValue]) return nil;
-        if (dict[@"created"] && [dict[@"created"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created"] && [dict[@"created"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created"] substringToIndex:10]]) return nil;
         if (![dict[@"created"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"lang"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"results"] isKindOfClass:NSDictionary.class]) return nil;
diff --git a/base/objective-c/test/inputs/json/misc/cf0d8.json/default/QTTopLevel.m b/head/objective-c/test/inputs/json/misc/cf0d8.json/default/QTTopLevel.m
index e85afe8..ea30c5a 100644
--- a/base/objective-c/test/inputs/json/misc/cf0d8.json/default/QTTopLevel.m
+++ b/head/objective-c/test/inputs/json/misc/cf0d8.json/default/QTTopLevel.m
@@ -217,7 +217,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
     if (self = [super init]) {
         if (![dict[@"count"] isKindOfClass:NSNumber.class]) return nil;
         if ([dict[@"count"] doubleValue] != [dict[@"count"] longLongValue]) return nil;
-        if (dict[@"created"] && [dict[@"created"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created"] && [dict[@"created"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created"] substringToIndex:10]]) return nil;
         if (![dict[@"created"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"lang"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"results"] isKindOfClass:NSDictionary.class]) return nil;
diff --git a/base/objective-c/test/inputs/json/misc/d23d5.json/default/QTTopLevel.m b/head/objective-c/test/inputs/json/misc/d23d5.json/default/QTTopLevel.m
index 2d7de1b..b29d35a 100644
--- a/base/objective-c/test/inputs/json/misc/d23d5.json/default/QTTopLevel.m
+++ b/head/objective-c/test/inputs/json/misc/d23d5.json/default/QTTopLevel.m
@@ -228,11 +228,13 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
 {
     if (self = [super init]) {
         if (!dict[@"acronym"]) return nil;
-        if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created_at"] substringToIndex:10]]) return nil;
         if (![dict[@"created_at"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"id"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"name"] isKindOfClass:NSString.class]) return nil;
-        if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"updated_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"updated_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"updated_at"] substringToIndex:10]]) return nil;
         if (![dict[@"updated_at"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"uri"] isKindOfClass:NSString.class]) return nil;
         [self setValuesForKeysWithDictionary:dict];
diff --git a/base/objective-c/test/inputs/json/misc/dbfb3.json/default/QTTopLevel.m b/head/objective-c/test/inputs/json/misc/dbfb3.json/default/QTTopLevel.m
index aed5ed8..a4a9f50 100644
--- a/base/objective-c/test/inputs/json/misc/dbfb3.json/default/QTTopLevel.m
+++ b/head/objective-c/test/inputs/json/misc/dbfb3.json/default/QTTopLevel.m
@@ -244,7 +244,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
     if (self = [super init]) {
         if (![dict[@"count"] isKindOfClass:NSNumber.class]) return nil;
         if ([dict[@"count"] doubleValue] != [dict[@"count"] longLongValue]) return nil;
-        if (dict[@"created"] && [dict[@"created"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created"] && [dict[@"created"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created"] substringToIndex:10]]) return nil;
         if (![dict[@"created"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"lang"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"results"] isKindOfClass:NSDictionary.class]) return nil;
diff --git a/base/objective-c/test/inputs/json/misc/df957.json/default/QTTopLevel.m b/head/objective-c/test/inputs/json/misc/df957.json/default/QTTopLevel.m
index e85afe8..ea30c5a 100644
--- a/base/objective-c/test/inputs/json/misc/df957.json/default/QTTopLevel.m
+++ b/head/objective-c/test/inputs/json/misc/df957.json/default/QTTopLevel.m
@@ -217,7 +217,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
     if (self = [super init]) {
         if (![dict[@"count"] isKindOfClass:NSNumber.class]) return nil;
         if ([dict[@"count"] doubleValue] != [dict[@"count"] longLongValue]) return nil;
-        if (dict[@"created"] && [dict[@"created"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created"] && [dict[@"created"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created"] substringToIndex:10]]) return nil;
         if (![dict[@"created"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"lang"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"results"] isKindOfClass:NSDictionary.class]) return nil;
diff --git a/base/objective-c/test/inputs/json/misc/e2915.json/default/QTTopLevel.m b/head/objective-c/test/inputs/json/misc/e2915.json/default/QTTopLevel.m
index 6d93fa3..0d96e42 100644
--- a/base/objective-c/test/inputs/json/misc/e2915.json/default/QTTopLevel.m
+++ b/head/objective-c/test/inputs/json/misc/e2915.json/default/QTTopLevel.m
@@ -242,7 +242,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
     if (self = [super init]) {
         if (![dict[@"count"] isKindOfClass:NSNumber.class]) return nil;
         if ([dict[@"count"] doubleValue] != [dict[@"count"] longLongValue]) return nil;
-        if (dict[@"created"] && [dict[@"created"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created"] && [dict[@"created"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created"] substringToIndex:10]]) return nil;
         if (![dict[@"created"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"lang"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"results"] isKindOfClass:NSDictionary.class]) return nil;
diff --git a/base/objective-c/test/inputs/json/priority/bug2663.json/default/QTTopLevel.m b/head/objective-c/test/inputs/json/priority/bug2663.json/default/QTTopLevel.m
index 65311fa..d0143a4 100644
--- a/base/objective-c/test/inputs/json/priority/bug2663.json/default/QTTopLevel.m
+++ b/head/objective-c/test/inputs/json/priority/bug2663.json/default/QTTopLevel.m
@@ -79,7 +79,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
 {
     if (self = [super init]) {
         if (![dict[@"birthday"] isKindOfClass:NSString.class]) return nil;
-        if (dict[@"lastSeen"] && [dict[@"lastSeen"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"lastSeen"] && [dict[@"lastSeen"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"lastSeen"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"lastSeen"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"lastSeen"] substringToIndex:10]]) return nil;
         if (![dict[@"lastSeen"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"name"] isKindOfClass:NSString.class]) return nil;
         [self setValuesForKeysWithDictionary:dict];
diff --git a/base/objective-c/test/inputs/json/priority/keywords.json/default/QTTopLevel.m b/head/objective-c/test/inputs/json/priority/keywords.json/default/QTTopLevel.m
index 1679b94..1b56d9c 100644
--- a/base/objective-c/test/inputs/json/priority/keywords.json/default/QTTopLevel.m
+++ b/head/objective-c/test/inputs/json/priority/keywords.json/default/QTTopLevel.m
@@ -5848,7 +5848,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
 - (instancetype)initWithJSONDictionary:(NSDictionary *)dict
 {
     if (self = [super init]) {
-        if (dict[@"DateTime"] && [dict[@"DateTime"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"DateTime"] && [dict[@"DateTime"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"DateTime"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"DateTime"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"DateTime"] substringToIndex:10]]) return nil;
         if (![dict[@"DateTime"] isKindOfClass:NSString.class]) return nil;
         [self setValuesForKeysWithDictionary:dict];
     }
diff --git a/base/objective-c/test/inputs/json/samples/github-events.json/default/QTTopLevel.m b/head/objective-c/test/inputs/json/samples/github-events.json/default/QTTopLevel.m
index fca41ce..297e587 100644
--- a/base/objective-c/test/inputs/json/samples/github-events.json/default/QTTopLevel.m
+++ b/head/objective-c/test/inputs/json/samples/github-events.json/default/QTTopLevel.m
@@ -194,7 +194,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
 {
     if (self = [super init]) {
         if (![dict[@"actor"] isKindOfClass:NSDictionary.class]) return nil;
-        if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created_at"] substringToIndex:10]]) return nil;
         if (![dict[@"created_at"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"id"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"public"] isKindOfClass:NSNumber.class]) return nil;
@@ -415,13 +416,15 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
 {
     if (self = [super init]) {
         if (![dict[@"body"] isKindOfClass:NSString.class]) return nil;
-        if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created_at"] substringToIndex:10]]) return nil;
         if (![dict[@"created_at"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"html_url"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"id"] isKindOfClass:NSNumber.class]) return nil;
         if ([dict[@"id"] doubleValue] != [dict[@"id"] longLongValue]) return nil;
         if (![dict[@"issue_url"] isKindOfClass:NSString.class]) return nil;
-        if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"updated_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"updated_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"updated_at"] substringToIndex:10]]) return nil;
         if (![dict[@"updated_at"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"url"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"user"] isKindOfClass:NSDictionary.class]) return nil;
@@ -708,7 +711,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
         if (![dict[@"comments"] isKindOfClass:NSNumber.class]) return nil;
         if ([dict[@"comments"] doubleValue] != [dict[@"comments"] longLongValue]) return nil;
         if (![dict[@"comments_url"] isKindOfClass:NSString.class]) return nil;
-        if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created_at"] substringToIndex:10]]) return nil;
         if (![dict[@"created_at"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"events_url"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"html_url"] isKindOfClass:NSString.class]) return nil;
@@ -723,7 +727,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
         if (![dict[@"repository_url"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"state"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"title"] isKindOfClass:NSString.class]) return nil;
-        if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"updated_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"updated_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"updated_at"] substringToIndex:10]]) return nil;
         if (![dict[@"updated_at"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"url"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"user"] isKindOfClass:NSDictionary.class]) return nil;
@@ -873,7 +878,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
         if (!dict[@"closed_at"]) return nil;
         if (![dict[@"closed_issues"] isKindOfClass:NSNumber.class]) return nil;
         if ([dict[@"closed_issues"] doubleValue] != [dict[@"closed_issues"] longLongValue]) return nil;
-        if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created_at"] substringToIndex:10]]) return nil;
         if (![dict[@"created_at"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"creator"] isKindOfClass:NSDictionary.class]) return nil;
         if (!dict[@"due_on"]) return nil;
@@ -888,7 +894,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
         if (![dict[@"state"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"description"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"title"] isKindOfClass:NSString.class]) return nil;
-        if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"updated_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"updated_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"updated_at"] substringToIndex:10]]) return nil;
         if (![dict[@"updated_at"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"url"] isKindOfClass:NSString.class]) return nil;
         [self setValuesForKeysWithDictionary:dict];
@@ -1052,7 +1059,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
         if (![dict[@"body"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"changed_files"] isKindOfClass:NSNumber.class]) return nil;
         if ([dict[@"changed_files"] doubleValue] != [dict[@"changed_files"] longLongValue]) return nil;
-        if (dict[@"closed_at"] && [dict[@"closed_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"closed_at"] && [dict[@"closed_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"closed_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"closed_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"closed_at"] substringToIndex:10]]) return nil;
         if (![dict[@"closed_at"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"comments"] isKindOfClass:NSNumber.class]) return nil;
         if ([dict[@"comments"] doubleValue] != [dict[@"comments"] longLongValue]) return nil;
@@ -1060,7 +1068,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
         if (![dict[@"commits"] isKindOfClass:NSNumber.class]) return nil;
         if ([dict[@"commits"] doubleValue] != [dict[@"commits"] longLongValue]) return nil;
         if (![dict[@"commits_url"] isKindOfClass:NSString.class]) return nil;
-        if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created_at"] substringToIndex:10]]) return nil;
         if (![dict[@"created_at"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"deletions"] isKindOfClass:NSNumber.class]) return nil;
         if ([dict[@"deletions"] doubleValue] != [dict[@"deletions"] longLongValue]) return nil;
@@ -1077,7 +1086,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
         if (![dict[@"merge_commit_sha"] isKindOfClass:NSString.class]) return nil;
         if (!dict[@"mergeable"]) return nil;
         if (![dict[@"mergeable_state"] isKindOfClass:NSString.class]) return nil;
-        if (dict[@"merged_at"] && [dict[@"merged_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"merged_at"] && [dict[@"merged_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"merged_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"merged_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"merged_at"] substringToIndex:10]]) return nil;
         if (![dict[@"merged_at"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"merged_by"] isKindOfClass:NSDictionary.class]) return nil;
         if (!dict[@"milestone"]) return nil;
@@ -1093,7 +1103,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
         if (![dict[@"state"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"statuses_url"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"title"] isKindOfClass:NSString.class]) return nil;
-        if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"updated_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"updated_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"updated_at"] substringToIndex:10]]) return nil;
         if (![dict[@"updated_at"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"url"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"user"] isKindOfClass:NSDictionary.class]) return nil;
@@ -1307,7 +1318,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
         if (![dict[@"compare_url"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"contents_url"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"contributors_url"] isKindOfClass:NSString.class]) return nil;
-        if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created_at"] && [dict[@"created_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"created_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"created_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"created_at"] substringToIndex:10]]) return nil;
         if (![dict[@"created_at"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"default_branch"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"deployments_url"] isKindOfClass:NSString.class]) return nil;
@@ -1353,7 +1365,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
         if ([dict[@"open_issues_count"] doubleValue] != [dict[@"open_issues_count"] longLongValue]) return nil;
         if (![dict[@"owner"] isKindOfClass:NSDictionary.class]) return nil;
         if (![dict[@"pulls_url"] isKindOfClass:NSString.class]) return nil;
-        if (dict[@"pushed_at"] && [dict[@"pushed_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"pushed_at"] && [dict[@"pushed_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"pushed_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"pushed_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"pushed_at"] substringToIndex:10]]) return nil;
         if (![dict[@"pushed_at"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"releases_url"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"size"] isKindOfClass:NSNumber.class]) return nil;
@@ -1370,7 +1383,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
         if (![dict[@"teams_url"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"description"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"trees_url"] isKindOfClass:NSString.class]) return nil;
-        if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"updated_at"] && [dict[@"updated_at"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"updated_at"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"updated_at"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"updated_at"] substringToIndex:10]]) return nil;
         if (![dict[@"updated_at"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"url"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"watchers"] isKindOfClass:NSNumber.class]) return nil;
diff --git a/base/php/test/inputs/json/misc/0a358.json/default/TopLevel.php b/head/php/test/inputs/json/misc/0a358.json/default/TopLevel.php
index d202a99..fe94c79 100644
--- a/base/php/test/inputs/json/misc/0a358.json/default/TopLevel.php
+++ b/head/php/test/inputs/json/misc/0a358.json/default/TopLevel.php
@@ -583,6 +583,10 @@ class Result {
      */
     public static function fromCreatedAt(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:Result::');
         }
@@ -731,6 +735,10 @@ class Result {
      */
     public static function fromUpdatedAt(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:Result::');
         }
diff --git a/base/php/test/inputs/json/misc/0a91a.json/default/TopLevel.php b/head/php/test/inputs/json/misc/0a91a.json/default/TopLevel.php
index d666e62..0698be2 100644
--- a/base/php/test/inputs/json/misc/0a91a.json/default/TopLevel.php
+++ b/head/php/test/inputs/json/misc/0a91a.json/default/TopLevel.php
@@ -89,6 +89,10 @@ class TopLevel {
      */
     public static function fromCreatedAt(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:TopLevel::');
         }
@@ -2790,6 +2794,10 @@ class PullRequest {
      */
     public static function fromClosedAt(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:PullRequest::');
         }
@@ -3032,6 +3040,10 @@ class PullRequest {
      */
     public static function fromCreatedAt(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:PullRequest::');
         }
@@ -3702,6 +3714,10 @@ class PullRequest {
      */
     public static function fromMergedAt(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:PullRequest::');
         }
@@ -4338,6 +4354,10 @@ class PullRequest {
      */
     public static function fromUpdatedAt(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:PullRequest::');
         }
@@ -5873,6 +5893,10 @@ class BaseRepo {
      */
     public static function fromCreatedAt(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:BaseRepo::');
         }
@@ -7817,6 +7841,10 @@ class BaseRepo {
      */
     public static function fromPushedAt(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:BaseRepo::');
         }
@@ -8435,6 +8463,10 @@ class BaseRepo {
      */
     public static function fromUpdatedAt(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:BaseRepo::');
         }
diff --git a/base/php/test/inputs/json/misc/16bc5.json/default/TopLevel.php b/head/php/test/inputs/json/misc/16bc5.json/default/TopLevel.php
index 51996fe..4733dda 100644
--- a/base/php/test/inputs/json/misc/16bc5.json/default/TopLevel.php
+++ b/head/php/test/inputs/json/misc/16bc5.json/default/TopLevel.php
@@ -178,6 +178,10 @@ class Query {
      */
     public static function fromCreated(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:Query::');
         }
diff --git a/base/php/test/inputs/json/misc/262f0.json/default/TopLevel.php b/head/php/test/inputs/json/misc/262f0.json/default/TopLevel.php
index da2fe1a..d73a50d 100644
--- a/base/php/test/inputs/json/misc/262f0.json/default/TopLevel.php
+++ b/head/php/test/inputs/json/misc/262f0.json/default/TopLevel.php
@@ -178,6 +178,10 @@ class Query {
      */
     public static function fromCreated(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:Query::');
         }
diff --git a/base/php/test/inputs/json/misc/32d5c.json/default/TopLevel.php b/head/php/test/inputs/json/misc/32d5c.json/default/TopLevel.php
index 0641104..97d6f42 100644
--- a/base/php/test/inputs/json/misc/32d5c.json/default/TopLevel.php
+++ b/head/php/test/inputs/json/misc/32d5c.json/default/TopLevel.php
@@ -42,6 +42,10 @@ class TopLevel {
     public static function fromBirthDate(?string $value): ?DateTime {
         if (!is_null($value)) {
             $tmp = new DateTime($value);
+            $errors = DateTime::getLastErrors();
+            if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+                throw new Exception('Invalid date-time');
+            }
             if (!is_a($tmp, 'DateTime')) {
                 throw new Exception('Attribute Error:TopLevel::');
             }
diff --git a/base/php/test/inputs/json/misc/337ed.json/default/TopLevel.php b/head/php/test/inputs/json/misc/337ed.json/default/TopLevel.php
index 659a3a1..fb40ebf 100644
--- a/base/php/test/inputs/json/misc/337ed.json/default/TopLevel.php
+++ b/head/php/test/inputs/json/misc/337ed.json/default/TopLevel.php
@@ -785,6 +785,10 @@ class Result {
      */
     public static function fromCreatedAt(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:Result::');
         }
@@ -998,6 +1002,10 @@ class Result {
      */
     public static function fromEndDate(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:Result::');
         }
@@ -1860,6 +1868,10 @@ class Result {
      */
     public static function fromStartDate(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:Result::');
         }
@@ -2238,6 +2250,10 @@ class Result {
      */
     public static function fromUpdatedAt(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:Result::');
         }
@@ -2678,6 +2694,10 @@ class CustomIncome {
      */
     public static function fromCreatedAt(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:CustomIncome::');
         }
@@ -2922,6 +2942,10 @@ class CustomIncome {
      */
     public static function fromUpdatedAt(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:CustomIncome::');
         }
diff --git a/base/php/test/inputs/json/misc/3f1ce.json/default/TopLevel.php b/head/php/test/inputs/json/misc/3f1ce.json/default/TopLevel.php
index b20431c..16acdf8 100644
--- a/base/php/test/inputs/json/misc/3f1ce.json/default/TopLevel.php
+++ b/head/php/test/inputs/json/misc/3f1ce.json/default/TopLevel.php
@@ -178,6 +178,10 @@ class Query {
      */
     public static function fromCreated(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:Query::');
         }
diff --git a/base/php/test/inputs/json/misc/4c547.json/default/TopLevel.php b/head/php/test/inputs/json/misc/4c547.json/default/TopLevel.php
index 51996fe..4733dda 100644
--- a/base/php/test/inputs/json/misc/4c547.json/default/TopLevel.php
+++ b/head/php/test/inputs/json/misc/4c547.json/default/TopLevel.php
@@ -178,6 +178,10 @@ class Query {
      */
     public static function fromCreated(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:Query::');
         }
diff --git a/base/php/test/inputs/json/misc/54d32.json/default/TopLevel.php b/head/php/test/inputs/json/misc/54d32.json/default/TopLevel.php
index cba4e6d..030a570 100644
--- a/base/php/test/inputs/json/misc/54d32.json/default/TopLevel.php
+++ b/head/php/test/inputs/json/misc/54d32.json/default/TopLevel.php
@@ -536,6 +536,10 @@ class Result {
      */
     public static function fromCreatedAt(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:Result::');
         }
@@ -779,6 +783,10 @@ class Result {
      */
     public static function fromUpdatedAt(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:Result::');
         }
diff --git a/base/php/test/inputs/json/misc/5eae5.json/default/TopLevel.php b/head/php/test/inputs/json/misc/5eae5.json/default/TopLevel.php
index 337bb78..023ebfe 100644
--- a/base/php/test/inputs/json/misc/5eae5.json/default/TopLevel.php
+++ b/head/php/test/inputs/json/misc/5eae5.json/default/TopLevel.php
@@ -29,6 +29,10 @@ class TopLevel {
      */
     public static function fromDate(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:TopLevel::');
         }
diff --git a/base/php/test/inputs/json/misc/6dec6.json/default/TopLevel.php b/head/php/test/inputs/json/misc/6dec6.json/default/TopLevel.php
index ca38755..c20639d 100644
--- a/base/php/test/inputs/json/misc/6dec6.json/default/TopLevel.php
+++ b/head/php/test/inputs/json/misc/6dec6.json/default/TopLevel.php
@@ -178,6 +178,10 @@ class Query {
      */
     public static function fromCreated(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:Query::');
         }
diff --git a/base/php/test/inputs/json/misc/734ad.json/default/TopLevel.php b/head/php/test/inputs/json/misc/734ad.json/default/TopLevel.php
index 988a1ff..3a70cfa 100644
--- a/base/php/test/inputs/json/misc/734ad.json/default/TopLevel.php
+++ b/head/php/test/inputs/json/misc/734ad.json/default/TopLevel.php
@@ -1685,6 +1685,10 @@ class Result {
      */
     public static function fromCreatedAt(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:Result::');
         }
@@ -2437,6 +2441,10 @@ class Result {
      */
     public static function fromLastUpdateDate(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:Result::');
         }
@@ -3269,6 +3277,10 @@ class Result {
      */
     public static function fromRegistrationDate(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:Result::');
         }
@@ -3512,6 +3524,10 @@ class Result {
      */
     public static function fromUpdatedAt(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:Result::');
         }
diff --git a/base/php/test/inputs/json/misc/77392.json/default/TopLevel.php b/head/php/test/inputs/json/misc/77392.json/default/TopLevel.php
index c25b83c..ed7b499 100644
--- a/base/php/test/inputs/json/misc/77392.json/default/TopLevel.php
+++ b/head/php/test/inputs/json/misc/77392.json/default/TopLevel.php
@@ -94,6 +94,10 @@ class TopLevel {
      */
     public static function fromDiscoveryDate(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:TopLevel::');
         }
diff --git a/base/php/test/inputs/json/misc/7f568.json/default/TopLevel.php b/head/php/test/inputs/json/misc/7f568.json/default/TopLevel.php
index 82ed5f2..88d9c4a 100644
--- a/base/php/test/inputs/json/misc/7f568.json/default/TopLevel.php
+++ b/head/php/test/inputs/json/misc/7f568.json/default/TopLevel.php
@@ -206,6 +206,10 @@ class TopLevel {
      */
     public static function fromCreatedAt(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:TopLevel::');
         }
@@ -708,6 +712,10 @@ class TopLevel {
      */
     public static function fromUpdatedAt(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:TopLevel::');
         }
diff --git a/base/php/test/inputs/json/misc/80aff.json/default/TopLevel.php b/head/php/test/inputs/json/misc/80aff.json/default/TopLevel.php
index a541ca5..b5cb22c 100644
--- a/base/php/test/inputs/json/misc/80aff.json/default/TopLevel.php
+++ b/head/php/test/inputs/json/misc/80aff.json/default/TopLevel.php
@@ -539,6 +539,10 @@ class Result {
      */
     public static function fromCreatedAt(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:Result::');
         }
@@ -791,6 +795,10 @@ class Result {
      */
     public static function fromUpdatedAt(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:Result::');
         }
diff --git a/base/php/test/inputs/json/misc/88130.json/default/TopLevel.php b/head/php/test/inputs/json/misc/88130.json/default/TopLevel.php
index 51996fe..4733dda 100644
--- a/base/php/test/inputs/json/misc/88130.json/default/TopLevel.php
+++ b/head/php/test/inputs/json/misc/88130.json/default/TopLevel.php
@@ -178,6 +178,10 @@ class Query {
      */
     public static function fromCreated(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:Query::');
         }
diff --git a/base/php/test/inputs/json/misc/9929c.json/default/TopLevel.php b/head/php/test/inputs/json/misc/9929c.json/default/TopLevel.php
index 51996fe..4733dda 100644
--- a/base/php/test/inputs/json/misc/9929c.json/default/TopLevel.php
+++ b/head/php/test/inputs/json/misc/9929c.json/default/TopLevel.php
@@ -178,6 +178,10 @@ class Query {
      */
     public static function fromCreated(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:Query::');
         }
diff --git a/base/php/test/inputs/json/misc/9ac3b.json/default/TopLevel.php b/head/php/test/inputs/json/misc/9ac3b.json/default/TopLevel.php
index 6e91f6c..0643ad8 100644
--- a/base/php/test/inputs/json/misc/9ac3b.json/default/TopLevel.php
+++ b/head/php/test/inputs/json/misc/9ac3b.json/default/TopLevel.php
@@ -551,6 +551,10 @@ class Result {
      */
     public static function fromCreatedAt(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:Result::');
         }
@@ -1003,6 +1007,10 @@ class Result {
      */
     public static function fromUpdatedAt(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:Result::');
         }
diff --git a/base/php/test/inputs/json/misc/a0496.json/default/TopLevel.php b/head/php/test/inputs/json/misc/a0496.json/default/TopLevel.php
index e0ba9e2..49f829a 100644
--- a/base/php/test/inputs/json/misc/a0496.json/default/TopLevel.php
+++ b/head/php/test/inputs/json/misc/a0496.json/default/TopLevel.php
@@ -841,6 +841,10 @@ class TopLevel {
      */
     public static function fromUpdatedAt(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:TopLevel::');
         }
diff --git a/base/php/test/inputs/json/misc/a1eca.json/default/TopLevel.php b/head/php/test/inputs/json/misc/a1eca.json/default/TopLevel.php
index 51996fe..4733dda 100644
--- a/base/php/test/inputs/json/misc/a1eca.json/default/TopLevel.php
+++ b/head/php/test/inputs/json/misc/a1eca.json/default/TopLevel.php
@@ -178,6 +178,10 @@ class Query {
      */
     public static function fromCreated(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:Query::');
         }
diff --git a/base/php/test/inputs/json/misc/b4865.json/default/TopLevel.php b/head/php/test/inputs/json/misc/b4865.json/default/TopLevel.php
index 612c3e7..d75c647 100644
--- a/base/php/test/inputs/json/misc/b4865.json/default/TopLevel.php
+++ b/head/php/test/inputs/json/misc/b4865.json/default/TopLevel.php
@@ -634,6 +634,10 @@ class TopLevel {
     public static function fromYear(?string $value): ?DateTime {
         if (!is_null($value)) {
             $tmp = new DateTime($value);
+            $errors = DateTime::getLastErrors();
+            if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+                throw new Exception('Invalid date-time');
+            }
             if (!is_a($tmp, 'DateTime')) {
                 throw new Exception('Attribute Error:TopLevel::');
             }
diff --git a/base/php/test/inputs/json/misc/cf0d8.json/default/TopLevel.php b/head/php/test/inputs/json/misc/cf0d8.json/default/TopLevel.php
index 51996fe..4733dda 100644
--- a/base/php/test/inputs/json/misc/cf0d8.json/default/TopLevel.php
+++ b/head/php/test/inputs/json/misc/cf0d8.json/default/TopLevel.php
@@ -178,6 +178,10 @@ class Query {
      */
     public static function fromCreated(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:Query::');
         }
diff --git a/base/php/test/inputs/json/misc/d23d5.json/default/TopLevel.php b/head/php/test/inputs/json/misc/d23d5.json/default/TopLevel.php
index ef14736..84cf084 100644
--- a/base/php/test/inputs/json/misc/d23d5.json/default/TopLevel.php
+++ b/head/php/test/inputs/json/misc/d23d5.json/default/TopLevel.php
@@ -593,6 +593,10 @@ class Result {
      */
     public static function fromCreatedAt(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:Result::');
         }
@@ -741,6 +745,10 @@ class Result {
      */
     public static function fromUpdatedAt(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:Result::');
         }
diff --git a/base/php/test/inputs/json/misc/dbfb3.json/default/TopLevel.php b/head/php/test/inputs/json/misc/dbfb3.json/default/TopLevel.php
index f7523ea..40b0a26 100644
--- a/base/php/test/inputs/json/misc/dbfb3.json/default/TopLevel.php
+++ b/head/php/test/inputs/json/misc/dbfb3.json/default/TopLevel.php
@@ -178,6 +178,10 @@ class Query {
      */
     public static function fromCreated(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:Query::');
         }
diff --git a/base/php/test/inputs/json/misc/df957.json/default/TopLevel.php b/head/php/test/inputs/json/misc/df957.json/default/TopLevel.php
index 51996fe..4733dda 100644
--- a/base/php/test/inputs/json/misc/df957.json/default/TopLevel.php
+++ b/head/php/test/inputs/json/misc/df957.json/default/TopLevel.php
@@ -178,6 +178,10 @@ class Query {
      */
     public static function fromCreated(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:Query::');
         }
diff --git a/base/php/test/inputs/json/misc/e2915.json/default/TopLevel.php b/head/php/test/inputs/json/misc/e2915.json/default/TopLevel.php
index f5b3cbb..041ee05 100644
--- a/base/php/test/inputs/json/misc/e2915.json/default/TopLevel.php
+++ b/head/php/test/inputs/json/misc/e2915.json/default/TopLevel.php
@@ -178,6 +178,10 @@ class Query {
      */
     public static function fromCreated(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:Query::');
         }
diff --git a/base/php/test/inputs/json/priority/bug2590.json/default/TopLevel.php b/head/php/test/inputs/json/priority/bug2590.json/default/TopLevel.php
index 7d13867..a55369c 100644
--- a/base/php/test/inputs/json/priority/bug2590.json/default/TopLevel.php
+++ b/head/php/test/inputs/json/priority/bug2590.json/default/TopLevel.php
@@ -140,6 +140,10 @@ class Invoice {
     public static function fromCreatedAt(?string $value): ?DateTime {
         if (!is_null($value)) {
             $tmp = new DateTime($value);
+            $errors = DateTime::getLastErrors();
+            if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+                throw new Exception('Invalid date-time');
+            }
             if (!is_a($tmp, 'DateTime')) {
                 throw new Exception('Attribute Error:Invoice::');
             }
diff --git a/base/php/test/inputs/json/priority/bug2663.json/default/TopLevel.php b/head/php/test/inputs/json/priority/bug2663.json/default/TopLevel.php
index cccbe55..cdb1682 100644
--- a/base/php/test/inputs/json/priority/bug2663.json/default/TopLevel.php
+++ b/head/php/test/inputs/json/priority/bug2663.json/default/TopLevel.php
@@ -73,6 +73,10 @@ class TopLevel {
      */
     public static function fromLastSeen(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:TopLevel::');
         }
diff --git a/base/php/test/inputs/json/priority/keywords.json/default/TopLevel.php b/head/php/test/inputs/json/priority/keywords.json/default/TopLevel.php
index 5bb28d0..d8f52fa 100644
--- a/base/php/test/inputs/json/priority/keywords.json/default/TopLevel.php
+++ b/head/php/test/inputs/json/priority/keywords.json/default/TopLevel.php
@@ -14963,6 +14963,10 @@ class DateTimeClass {
      */
     public static function fromDateTime(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:DateTimeClass::');
         }
diff --git a/base/php/test/inputs/json/samples/github-events.json/default/TopLevel.php b/head/php/test/inputs/json/samples/github-events.json/default/TopLevel.php
index b455ff1..d22d464 100644
--- a/base/php/test/inputs/json/samples/github-events.json/default/TopLevel.php
+++ b/head/php/test/inputs/json/samples/github-events.json/default/TopLevel.php
@@ -89,6 +89,10 @@ class TopLevel {
      */
     public static function fromCreatedAt(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:TopLevel::');
         }
@@ -2082,6 +2086,10 @@ class Comment {
      */
     public static function fromCreatedAt(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:Comment::');
         }
@@ -2277,6 +2285,10 @@ class Comment {
      */
     public static function fromUpdatedAt(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:Comment::');
         }
@@ -4299,6 +4311,10 @@ class Issue {
     public static function fromClosedAt(?string $value): ?DateTime {
         if (!is_null($value)) {
             $tmp = new DateTime($value);
+            $errors = DateTime::getLastErrors();
+            if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+                throw new Exception('Invalid date-time');
+            }
             if (!is_a($tmp, 'DateTime')) {
                 throw new Exception('Attribute Error:Issue::');
             }
@@ -4456,6 +4472,10 @@ class Issue {
      */
     public static function fromCreatedAt(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:Issue::');
         }
@@ -5108,6 +5128,10 @@ class Issue {
      */
     public static function fromUpdatedAt(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:Issue::');
         }
@@ -5923,6 +5947,10 @@ class Milestone {
      */
     public static function fromCreatedAt(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:Milestone::');
         }
@@ -6073,6 +6101,10 @@ class Milestone {
     public static function fromDueOn(?string $value): ?DateTime {
         if (!is_null($value)) {
             $tmp = new DateTime($value);
+            $errors = DateTime::getLastErrors();
+            if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+                throw new Exception('Invalid date-time');
+            }
             if (!is_a($tmp, 'DateTime')) {
                 throw new Exception('Attribute Error:Milestone::');
             }
@@ -6465,6 +6497,10 @@ class Milestone {
      */
     public static function fromUpdatedAt(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:Milestone::');
         }
@@ -7407,6 +7443,10 @@ class PayloadPullRequest {
      */
     public static function fromClosedAt(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:PayloadPullRequest::');
         }
@@ -7649,6 +7689,10 @@ class PayloadPullRequest {
      */
     public static function fromCreatedAt(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:PayloadPullRequest::');
         }
@@ -8319,6 +8363,10 @@ class PayloadPullRequest {
      */
     public static function fromMergedAt(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:PayloadPullRequest::');
         }
@@ -8955,6 +9003,10 @@ class PayloadPullRequest {
      */
     public static function fromUpdatedAt(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:PayloadPullRequest::');
         }
@@ -10490,6 +10542,10 @@ class BaseRepo {
      */
     public static function fromCreatedAt(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:BaseRepo::');
         }
@@ -12428,6 +12484,10 @@ class BaseRepo {
      */
     public static function fromPushedAt(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:BaseRepo::');
         }
@@ -13046,6 +13106,10 @@ class BaseRepo {
      */
     public static function fromUpdatedAt(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:BaseRepo::');
         }
diff --git a/base/php/test/inputs/json/samples/null-safe.json/default/TopLevel.php b/head/php/test/inputs/json/samples/null-safe.json/default/TopLevel.php
index ad97f86..bb50cf8 100644
--- a/base/php/test/inputs/json/samples/null-safe.json/default/TopLevel.php
+++ b/head/php/test/inputs/json/samples/null-safe.json/default/TopLevel.php
@@ -201,6 +201,10 @@ class Item {
     public static function fromCreatedAt(?string $value): ?DateTime {
         if (!is_null($value)) {
             $tmp = new DateTime($value);
+            $errors = DateTime::getLastErrors();
+            if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+                throw new Exception('Invalid date-time');
+            }
             if (!is_a($tmp, 'DateTime')) {
                 throw new Exception('Attribute Error:Item::');
             }
diff --git a/base/schema-cplusplus/test/inputs/schema/date-time.schema/default/quicktype.hpp b/head/schema-cplusplus/test/inputs/schema/date-time.schema/default/quicktype.hpp
index a198eb5..0bbb00f 100644
--- a/base/schema-cplusplus/test/inputs/schema/date-time.schema/default/quicktype.hpp
+++ b/head/schema-cplusplus/test/inputs/schema/date-time.schema/default/quicktype.hpp
@@ -146,7 +146,7 @@ namespace quicktype {
         if (!j.is_object()) throw std::runtime_error("Expected object");
         x.set_complex_union_array(j.at("complex-union-array").get<std::vector<ComplexUnionArrayElement>>());
         x.set_date(j.at("date").get<std::string>());
-        if (j.find("date-time") != j.end() && !std::regex_match(j.at("date-time").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("date-time") != j.end() && !std::regex_match(j.at("date-time").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_date_time(j.at("date-time").get<std::string>());
         x.set_time(j.at("time").get<std::string>());
         x.set_union_array(j.at("union-array").get<std::vector<std::string>>());
diff --git a/base/schema-cplusplus/test/inputs/schema/optional-date-time.schema/default/quicktype.hpp b/head/schema-cplusplus/test/inputs/schema/optional-date-time.schema/default/quicktype.hpp
index a283e2a..48f953a 100644
--- a/base/schema-cplusplus/test/inputs/schema/optional-date-time.schema/default/quicktype.hpp
+++ b/head/schema-cplusplus/test/inputs/schema/optional-date-time.schema/default/quicktype.hpp
@@ -136,13 +136,13 @@ namespace quicktype {
         if (!j.is_object()) throw std::runtime_error("Expected object");
         if (j.find("optional-date") != j.end() && j.at("optional-date").is_null()) throw std::runtime_error("Unexpected null");
         x.set_optional_date(get_stack_optional<std::string>(j, "optional-date"));
-        if (j.find("optional-date-time") != j.end() && !std::regex_match(j.at("optional-date-time").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("optional-date-time") != j.end() && !std::regex_match(j.at("optional-date-time").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         if (j.find("optional-date-time") != j.end() && j.at("optional-date-time").is_null()) throw std::runtime_error("Unexpected null");
         x.set_optional_date_time(get_stack_optional<std::string>(j, "optional-date-time"));
         if (j.find("optional-time") != j.end() && j.at("optional-time").is_null()) throw std::runtime_error("Unexpected null");
         x.set_optional_time(get_stack_optional<std::string>(j, "optional-time"));
         x.set_required_date(j.at("required-date").get<std::string>());
-        if (j.find("required-date-time") != j.end() && !std::regex_match(j.at("required-date-time").get<std::string>(), std::regex("^[0-9]{4}-[0-9]{2}-[0-9]{2}T.*$"))) throw std::runtime_error("Expected date-time");
+        if (j.find("required-date-time") != j.end() && !std::regex_match(j.at("required-date-time").get<std::string>(), std::regex("^(?:(?:[0-9]{4}-(?:0[13578]|1[02])-(?:0[1-9]|[12][0-9]|3[01]))|(?:[0-9]{4}-(?:0[469]|11)-(?:0[1-9]|[12][0-9]|30))|(?:[0-9]{4}-02-(?:0[1-9]|1[0-9]|2[0-8]))|(?:(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:[02468][048]|[13579][26])00)-02-29))[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:[.][0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$"))) throw std::runtime_error("Expected date-time");
         x.set_required_date_time(j.at("required-date-time").get<std::string>());
         x.set_required_time(j.at("required-time").get<std::string>());
     }
diff --git a/base/schema-objective-c/test/inputs/schema/date-time.schema/default/QTTopLevel.m b/head/schema-objective-c/test/inputs/schema/date-time.schema/default/QTTopLevel.m
index d7eebe6..3972fe7 100644
--- a/base/schema-objective-c/test/inputs/schema/date-time.schema/default/QTTopLevel.m
+++ b/head/schema-objective-c/test/inputs/schema/date-time.schema/default/QTTopLevel.m
@@ -121,7 +121,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
     if (self = [super init]) {
         if (![dict[@"complex-union-array"] isKindOfClass:NSArray.class]) return nil;
         if (![dict[@"date"] isKindOfClass:NSString.class]) return nil;
-        if (dict[@"date-time"] && [dict[@"date-time"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"date-time"] && [dict[@"date-time"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"date-time"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"date-time"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"date-time"] substringToIndex:10]]) return nil;
         if (![dict[@"date-time"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"time"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"union-array"] isKindOfClass:NSArray.class]) return nil;
diff --git a/base/schema-objective-c/test/inputs/schema/optional-date-time.schema/default/QTTopLevel.m b/head/schema-objective-c/test/inputs/schema/optional-date-time.schema/default/QTTopLevel.m
index c324d64..f919e59 100644
--- a/base/schema-objective-c/test/inputs/schema/optional-date-time.schema/default/QTTopLevel.m
+++ b/head/schema-objective-c/test/inputs/schema/optional-date-time.schema/default/QTTopLevel.m
@@ -82,7 +82,8 @@ NSString *_Nullable QTTopLevelToJSON(QTTopLevel *topLevel, NSStringEncoding enco
 {
     if (self = [super init]) {
         if (![dict[@"required-date"] isKindOfClass:NSString.class]) return nil;
-        if (dict[@"required-date-time"] && [dict[@"required-date-time"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}T" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"required-date-time"] && [dict[@"required-date-time"] rangeOfString:@"^[0-9]{4}-[0-9]{2}-[0-9]{2}[Tt](?:[01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](?:\\.[0-9]+)?(?:[Zz]|[+-](?:[01][0-9]|2[0-3]):[0-5][0-9])?$" options:NSRegularExpressionSearch].location == NSNotFound) return nil;
+        if (dict[@"required-date-time"] && ![[[[NSISO8601DateFormatter new] stringFromDate:[[NSISO8601DateFormatter new] dateFromString:[[dict[@"required-date-time"] substringToIndex:10] stringByAppendingString:@"T00:00:00Z"]]] substringToIndex:10] isEqualToString:[dict[@"required-date-time"] substringToIndex:10]]) return nil;
         if (![dict[@"required-date-time"] isKindOfClass:NSString.class]) return nil;
         if (![dict[@"required-time"] isKindOfClass:NSString.class]) return nil;
         [self setValuesForKeysWithDictionary:dict];
diff --git a/base/schema-php/test/inputs/schema/date-time-or-string.schema/default/TopLevel.php b/head/schema-php/test/inputs/schema/date-time-or-string.schema/default/TopLevel.php
index 304c03c..2aa15da 100644
--- a/base/schema-php/test/inputs/schema/date-time-or-string.schema/default/TopLevel.php
+++ b/head/schema-php/test/inputs/schema/date-time-or-string.schema/default/TopLevel.php
@@ -26,6 +26,10 @@ class TopLevel {
             return Bar::from($value); /*enum*/
         } elseif (is_string($value)) {
             $tmp = new DateTime($value);
+            $errors = DateTime::getLastErrors();
+            if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+                throw new Exception('Invalid date-time');
+            }
             if (!is_a($tmp, 'DateTime')) {
                 throw new Exception('Attribute Error:TopLevel::');
             }
diff --git a/base/schema-php/test/inputs/schema/date-time.schema/default/TopLevel.php b/head/schema-php/test/inputs/schema/date-time.schema/default/TopLevel.php
index fa72b0b..3077d4b 100644
--- a/base/schema-php/test/inputs/schema/date-time.schema/default/TopLevel.php
+++ b/head/schema-php/test/inputs/schema/date-time.schema/default/TopLevel.php
@@ -36,6 +36,10 @@ class TopLevel {
                 return ComplexUnionArray::from($value); /*enum*/
             } elseif (is_string($value)) {
                 $tmp = new DateTime($value);
+                $errors = DateTime::getLastErrors();
+                if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+                    throw new Exception('Invalid date-time');
+                }
                 if (!is_a($tmp, 'DateTime')) {
                     throw new Exception('Attribute Error:TopLevel::');
                 }
@@ -170,6 +174,10 @@ class TopLevel {
      */
     public static function fromDateTime(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:TopLevel::');
         }
diff --git a/base/schema-php/test/inputs/schema/optional-date-time.schema/default/TopLevel.php b/head/schema-php/test/inputs/schema/optional-date-time.schema/default/TopLevel.php
index ccab7ff..14aa727 100644
--- a/base/schema-php/test/inputs/schema/optional-date-time.schema/default/TopLevel.php
+++ b/head/schema-php/test/inputs/schema/optional-date-time.schema/default/TopLevel.php
@@ -93,6 +93,10 @@ class TopLevel {
     public static function fromOptionalDateTime(?string $value): ?DateTime {
         if (!is_null($value)) {
             $tmp = new DateTime($value);
+            $errors = DateTime::getLastErrors();
+            if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+                throw new Exception('Invalid date-time');
+            }
             if (!is_a($tmp, 'DateTime')) {
                 throw new Exception('Attribute Error:TopLevel::');
             }
@@ -260,6 +264,10 @@ class TopLevel {
      */
     public static function fromRequiredDateTime(string $value): DateTime {
         $tmp = new DateTime($value);
+        $errors = DateTime::getLastErrors();
+        if ($errors && ($errors['warning_count'] || $errors['error_count'])) {
+            throw new Exception('Invalid date-time');
+        }
         if (!is_a($tmp, 'DateTime')) {
             throw new Exception('Attribute Error:TopLevel::');
         }
