Bring extra-milliseconds fix to main

1. bring code from https://github.com/Ranchero-Software/RSParser/pull/78/files to main.
This commit is contained in:
zll600 2024-08-25 15:44:31 +08:00
parent 65a18129ca
commit 090c8e0247
2 changed files with 10 additions and 6 deletions

View File

@ -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)
}
}

View File

@ -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);