diff --git a/Modules/Parser/Tests/ParserTests/RSDateParserTests.swift b/Modules/Parser/Tests/ParserTests/RSDateParserTests.swift index d12df35ad..740bdf046 100644 --- a/Modules/Parser/Tests/ParserTests/RSDateParserTests.swift +++ b/Modules/Parser/Tests/ParserTests/RSDateParserTests.swift @@ -11,7 +11,7 @@ import Parser class RSDateParserTests: XCTestCase { - static func dateWithValues(_ year: Int, _ month: Int, _ day: Int, _ hour: Int, _ minute: Int, _ second: Int) -> Date { + static func dateWithValues(_ year: Int, _ month: Int, _ day: Int, _ hour: Int, _ minute: Int, _ second: Int, _ milliseconds: Int = 0) -> Date { var dateComponents = DateComponents() dateComponents.calendar = Calendar.current dateComponents.timeZone = TimeZone(secondsFromGMT: 0) @@ -22,6 +22,7 @@ class RSDateParserTests: XCTestCase { dateComponents.hour = hour dateComponents.minute = minute dateComponents.second = second + dateComponents.nanosecond = milliseconds * 1000000 return dateComponents.date! } @@ -100,9 +101,9 @@ class RSDateParserTests: XCTestCase { XCTAssertEqual(d, expectedDateResult) } -// func testHighMillisecondDate() { -// let expectedDateResult = Self.dateWithValues(2021, 03, 29, 10, 46, 56) -// let d = RSDateWithString("2021-03-29T10:46:56.516941+00:00") -// XCTAssertEqual(d, expectedDateResult) -// } + func testHighMillisecondDate() { + let expectedDateResult = Self.dateWithValues(2021, 03, 29, 10, 46, 56, 516) + let d = RSDateWithString("2021-03-29T10:46:56.516941+00:00") + XCTAssertEqual(d!.timeIntervalSince1970, expectedDateResult.timeIntervalSince1970, accuracy: 0.000001) + } } diff --git a/Modules/ParserObjC/Sources/ParserObjC/RSDateParser.m b/Modules/ParserObjC/Sources/ParserObjC/RSDateParser.m index cb9c572d3..3eced1170 100755 --- a/Modules/ParserObjC/Sources/ParserObjC/RSDateParser.m +++ b/Modules/ParserObjC/Sources/ParserObjC/RSDateParser.m @@ -389,6 +389,9 @@ static NSDate *RSParseW3CWithBytes(const char *bytes, NSUInteger numberOfBytes) if (hasMilliseconds) { milliseconds = nextNumericValue(bytes, numberOfBytes, currentIndex, 3, &finalIndex); currentIndex = finalIndex + 1; + + // Igore more than 3 digits for fraction of a second + while (currentIndex < numberOfBytes && isdigit(bytes[currentIndex])) currentIndex++; } timeZoneOffset = parsedTimeZoneOffset(bytes, numberOfBytes, currentIndex);