public static bool TryParse(string input, IFormatProvider formatProvider, DateTimeStyles styles, out DateTimeOffset result)
        {
            result = MinValue;
            styles = ValidateStyles(styles, nameof(styles));

            var inputOffset = ParseOffset(input);

            if (inputOffset.HasValue || (styles & DateTimeStyles.AssumeUniversal) > 0)
            {
                styles |= DateTimeStyles.AdjustToUniversal;
            }

            DateTime dtParsed;

            if (!DateTime2.TryParse(input, DateTimeFormatInfo.GetInstance(formatProvider), styles, out dtParsed))
            {
                return(false);
            }

            if (inputOffset.HasValue)
            {
                result = new DateTimeOffset(dtParsed, inputOffset.Value, false);
            }
            else
            {
                result = new DateTimeOffset(dtParsed);
            }

            return(true);
        }
        public static bool TryParseExact(string input, string[] formats, IFormatProvider formatProvider, DateTimeStyles styles, out DateTimeOffset result)
        {
            if (formats == null)
            {
                throw new ArgumentNullException(nameof(formats));
            }
            if (formats.Length == 0)
            {
                throw new FormatException("The list of formats cannot be empty");
            }

            for (int i = 0; i < formats.Length; i++)
            {
                if (formats[i].Equals("u", StringComparison.Ordinal))
                {
                    formats[i] = UtcFormatString + "Z";
                }
                else if (formats[i].Equals("r", StringComparison.OrdinalIgnoreCase))
                {
                    formats[i] = RUtcFormatString + "z";
                    int gmtIndex = input.Length - 4;
                    if (input.IndexOf(" GMT") == gmtIndex)
                    {
                        input = string.Concat(input.Remove(gmtIndex), "+0");
                    }
                }
            }

            result = MinValue;
            styles = ValidateStyles(styles, nameof(styles));

            var inputOffset = ParseOffset(input);

            if (inputOffset.HasValue || (styles & DateTimeStyles.AssumeUniversal) > 0)
            {
                styles |= DateTimeStyles.AdjustToUniversal;
            }

            DateTime dtParsed;

            if (!DateTime2.TryParseExact(input, formats, DateTimeFormatInfo.GetInstance(formatProvider), styles, out dtParsed))
            {
                return(false);
            }

            if (inputOffset.HasValue)
            {
                result = new DateTimeOffset(dtParsed, inputOffset.Value, false);
            }
            else
            {
                result = new DateTimeOffset(dtParsed);
            }

            return(true);
        }