InitializeDateTimeFormat = function (dateTimeFormat, locales, options) {
            const requestedLocales = CanonicalizeLocaleList(locales);
            options = ToDateTimeOptions(options, "any", "date");

            const opt = _.create();
            opt.localeMatcher = GetOption(options, "localeMatcher", "string", ["lookup", "best fit"], "best fit");

            // Providing undefined for the `values` argument allows { hour12: "asd" } to become hour12 = true,
            // which is apparently a feature of the spec, rather than a bug.
            const hour12 = GetOption(options, "hour12", "boolean", undefined, undefined);
            let hourCycle = GetOption(options, "hourCycle", "string", ["h11", "h12", "h23", "h24"], undefined);
            if (hour12 !== undefined) {
                hourCycle = null;
            }
            opt.hc = hourCycle;

            const r = ResolveLocale(platform.isDTFLocaleAvailable, requestedLocales, opt, ["nu", "ca", "hc"]);
            dateTimeFormat.locale = r.locale;
            dateTimeFormat.calendar = r.ca;
            dateTimeFormat.hourCycle = r.hc;
            dateTimeFormat.numberingSystem = r.nu;

            const localeWithoutSubtags = r.dataLocale;
            let tz = options.timeZone;
            if (tz === undefined) {
                tz = platform.getDefaultTimeZone();
            } else {
                tz = Internal.ToString(tz);
            }

            // make tz uppercase here, as its easier to do now than in platform (even though the uppercase operation
            // is supposed to be done in #sec-isvalidtimezonename)
            const canonicalTZ = platform.validateAndCanonicalizeTimeZone(tz);
            if (canonicalTZ === undefined || canonicalTZ === "Etc/Unknown") {
                platform.raiseOptionValueOutOfRange_3(tz, "timeZone", "IANA Zone or Link name (Area/Location)");
            } else if (canonicalTZ === "Etc/UTC" || canonicalTZ === "Etc/GMT") {
                tz = "UTC";
            } else {
                tz = canonicalTZ;
            }

            dateTimeFormat.timeZone = tz;

            // get the formatMatcher for validation only
            GetOption(options, "formatMatcher", "string", ["basic", "best fit"], "best fit");

            // this call replaces most of the spec code related to hour12/hourCycle and format negotiation/handling
            getPatternForOptions(dateTimeFormat, options, hour12);
            dateTimeFormat.initializedDateTimeFormat = true;

            return dateTimeFormat;
        }
Initializes the dateTimeFormat argument with the given locales and options.

ECMA-402: #sec-initializedatetimeformat

@param {Object} dateTimeFormat the state object representing a DateTimeFormat instance or toLocale*String call
@param {String|String[]} locales a user-provided list of locales
@param {Object} options a user-provided options object