Skip to content

[BUG]: ISO 8601 date string inferred as String? instead of DateTime in Dart output #3533

Description

@vraj129

ISO 8601 date string inferred as String? instead of DateTime in Dart output

Issue Type

Quicktype output / Type inference issue

Context (Environment, Version, Language)

Input Format: JSON
Output Language: Dart

CLI, npm, or app.quicktype.io: app.quicktype.io / CLI
Version: Latest

Description

ISO 8601 formatted date-time strings (e.g., "2025-08-19T08:08:45.087") are currently being typed as optional String? rather than being detected as DateTime types in Dart code generation. Older versions of quicktype automatically recognized ISO date strings and generated DateTime.parse() / toIso8601String() methods.

Input Data

{
  "LastRecorded": "2025-08-19T08:08:45.087"
}

Expected Behaviour / Output

ISO date-time strings should be inferred as DateTime (or DateTime? if nullability is enabled), producing parsing logic like:

import 'dart:convert';

Welcome welcomeFromJson(String str) => Welcome.fromJson(json.decode(str));

String welcomeToJson(Welcome data) => json.encode(data.toJson());

class Welcome {
    DateTime lastRecorded;

    Welcome({
        required this.lastRecorded,
    });

    factory Welcome.fromJson(Map<String, dynamic> json) => Welcome(
        lastRecorded: DateTime.parse(json["LastRecorded"]),
    );

    Map<String, dynamic> toJson() => {
        "LastRecorded": lastRecorded.toIso8601String(),
    };
}

Current Behaviour / Output

The field is treated as a generic nullable String?:

import 'dart:convert';

Temperatures temperaturesFromJson(String str) => Temperatures.fromJson(json.decode(str));

String temperaturesToJson(Temperatures data) => json.encode(data.toJson());

class Temperatures {
    String? lastRecorded;

    Temperatures({
        this.lastRecorded,
    });

    factory Temperatures.fromJson(Map<String, dynamic> json) => Temperatures(
        lastRecorded: json["LastRecorded"],
    );

    Map<String, dynamic> toJson() => {
        "LastRecorded": lastRecorded,
    };
}

Steps to Reproduce

  1. Open app.quicktype.io (or run quicktype CLI).
  2. Set target language to Dart.
  3. Input JSON containing an ISO 8601 timestamp: {"LastRecorded": "2025-08-19T08:08:45.087"}.
  4. Observe that lastRecorded is generated as String? instead of DateTime.

Possible Solution

Ensure string format inference checks ISO 8601 patterns prior to defaulting to String for Dart generation, or verify that the "Detect dates & times" option setting is active in the Dart target options.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions