Skip to content

Commit 795a622

Browse files
authored
Merge pull request #2122 from spevans/pr_sr_9439_50
[5.0] SR-9439: Calendar.dateComponetns: Enable .nanoseconds
2 parents d447657 + 7a206e9 commit 795a622

File tree

2 files changed

+36
-6
lines changed

2 files changed

+36
-6
lines changed

Foundation/NSCalendar.swift

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -643,9 +643,9 @@ open class NSCalendar : NSObject, NSCopying, NSSecureCoding {
643643

644644
open func components(_ unitFlags: Unit, from startingDate: Date, to resultDate: Date, options opts: Options = []) -> DateComponents {
645645
let validUnitFlags: NSCalendar.Unit = [
646-
.era, .year, .month, .day, .hour, .minute, .second, .weekOfYear, .weekOfMonth, .yearForWeekOfYear, .weekday, .weekdayOrdinal ]
646+
.era, .year, .month, .day, .hour, .minute, .second, .nanosecond, .weekOfYear, .weekOfMonth, .yearForWeekOfYear, .weekday, .weekdayOrdinal ]
647647

648-
let invalidUnitFlags: NSCalendar.Unit = [ .quarter, .nanosecond, .timeZone, .calendar]
648+
let invalidUnitFlags: NSCalendar.Unit = [ .quarter, .timeZone, .calendar]
649649

650650
// Mask off the unsupported fields
651651
let newUnitFlags = Unit(rawValue: unitFlags.rawValue & validUnitFlags.rawValue)
@@ -665,10 +665,7 @@ open class NSCalendar : NSObject, NSCopying, NSSecureCoding {
665665
let emptyUnitFlags = Unit(rawValue: unitFlags.rawValue & invalidUnitFlags.rawValue)
666666
var components = _components(newUnitFlags, vector: ints, addIsLeapMonth: false)
667667

668-
// nanosecond and quarter always get set to zero if requested in the output
669-
if emptyUnitFlags.contains(.nanosecond) {
670-
components.nanosecond = 0
671-
}
668+
// quarter always gets set to zero if requested in the output
672669
if emptyUnitFlags.contains(.quarter) {
673670
components.quarter = 0
674671
}

TestFoundation/TestCalendar.swift

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,7 @@ class TestNSDateComponents: XCTestCase {
215215
("test_hash", test_hash),
216216
("test_copyNSDateComponents", test_copyNSDateComponents),
217217
("test_dateDifferenceComponents", test_dateDifferenceComponents),
218+
("test_nanoseconds", test_nanoseconds),
218219
]
219220
}
220221

@@ -429,4 +430,36 @@ class TestNSDateComponents: XCTestCase {
429430
XCTAssertNil(diff9.calendar)
430431
XCTAssertNil(diff9.timeZone)
431432
}
433+
434+
func test_nanoseconds() throws {
435+
// 1971-06-21 00:00:00
436+
let date1 = Date(timeIntervalSince1970: 46310400)
437+
438+
// 1971-06-21 00:00:00.00123
439+
let date2 = Date(timeIntervalSince1970: 46310400.00123)
440+
441+
// 1971-06-24 00:16:40:00123
442+
let date3 = Date(timeIntervalSince1970: 46570600.45678)
443+
444+
var calendar = Calendar.current
445+
calendar.timeZone = try TimeZone(abbreviation: "UTC").unwrapped()
446+
447+
let diff1 = calendar.dateComponents([.nanosecond], from: date1, to: date2)
448+
XCTAssertEqual(diff1.nanosecond, 1230003)
449+
450+
let diff2 = calendar.dateComponents([.nanosecond], from: date1, to: date2)
451+
XCTAssertEqual(diff2.nanosecond, 1230003)
452+
453+
let diff3 = calendar.dateComponents([.day, .minute, .second, .nanosecond], from: date2, to: date3)
454+
XCTAssertEqual(diff3.day, 3)
455+
XCTAssertEqual(diff3.minute, 16)
456+
XCTAssertEqual(diff3.second, 40)
457+
XCTAssertEqual(diff3.nanosecond, 455549949)
458+
459+
let diff4 = calendar.dateComponents([.day, .minute, .second, .nanosecond], from: date3, to: date2)
460+
XCTAssertEqual(diff4.day, -3)
461+
XCTAssertEqual(diff4.minute, -16)
462+
XCTAssertEqual(diff4.second, -40)
463+
XCTAssertEqual(diff4.nanosecond, -455549950)
464+
}
432465
}

0 commit comments

Comments
 (0)