public void FailParseInvalidInputs(string input)
        {
            // action
            var tryParseResult = Rfc3339TimestampParser.TryParseTimestampFromString(input, out _);

            // assert
            Assert.False(tryParseResult);
        }
        public void ParseValidInputs(string input, DateTimeOffset expectedOutput)
        {
            // action
            var tryParseResult = Rfc3339TimestampParser.TryParseTimestampFromString(input, out var actualOutput);

            // assert
            Assert.True(tryParseResult);
            Assert.Equal(expectedOutput, actualOutput);
        }
        public static bool TryParseTimestampFromString(string timestampString, out DateTimeOffset parsedTimestamp)
        {
            parsedTimestamp = default;

            if (string.IsNullOrWhiteSpace(timestampString))
            {
                return(false);
            }

            timestampString = timestampString.Trim();

            if (Rfc3339TimestampParser.TryParseTimestampFromString(timestampString, out parsedTimestamp))
            {
                return(true);
            }

            if (Rfc822TimestampParser.TryParseTimestampFromString(timestampString, out parsedTimestamp))
            {
                return(true);
            }

            // try other formats
            timestampString = timestampString.ToUpperInvariant();

            if (DateTimeOffset.TryParseExact(timestampString, OtherFormatsWithoutOffset, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out parsedTimestamp))
            {
                return(true);
            }

            if (DateTimeOffset.TryParseExact(timestampString, OtherFormatsWithOffset, CultureInfo.InvariantCulture, DateTimeStyles.None, out parsedTimestamp))
            {
                return(true);
            }

            // try default parsing
            if (DateTimeOffset.TryParse(timestampString, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out parsedTimestamp))
            {
                return(true);
            }

            return(false);
        }