Return a `struct_time` converted from a Julian Date float number.

    WARNING: Conversion to then from Julian Date value to `struct_time` can be
    inaccurate and lose or gain time, especially for BC (negative) years.

    NOTE: extra fields `tm_wday`, `tm_yday`, and `tm_isdst` are set to default
    values, not real ones.

def jd_to_struct_time(jd):
    """
    Return a `struct_time` converted from a Julian Date float number.

    WARNING: Conversion to then from Julian Date value to `struct_time` can be
    inaccurate and lose or gain time, especially for BC (negative) years.

    NOTE: extra fields `tm_wday`, `tm_yday`, and `tm_isdst` are set to default
    values, not real ones.
    """
    year, month, day = jdutil.jd_to_date(jd)

    # Convert time of day from fraction of day
    day_fraction = day - int(day)
    hour, minute, second, ms = jdutil.days_to_hmsm(day_fraction)
    day = int(day)

    # This conversion can return negative values for items we do not want to be
    # negative: month, day, hour, minute, second.
    year, month, day, hour, minute, second = _roll_negative_time_fields(
        year, month, day, hour, minute, second)

    return struct_time(
        [year, month, day, hour, minute, second] + TIME_EMPTY_EXTRAS
    )