Skip to content

Commit e170040

Browse files
alblueparkera
authored andcommitted
Add support for ISO8601 calendar and others (#677)
The list of valid keys did not include the ISO8601 calendar, which meant that code running on Linux that used it would fail. Fix this by adding the kCFISO8601Calendar and others into the list of known constants valid for calendars, and add tests for the Gregorian calendar, as well as for creating all other calendars. Issue: SR-2551
1 parent 1290b9e commit e170040

File tree

4 files changed

+51
-3
lines changed

4 files changed

+51
-3
lines changed

CoreFoundation/Locale.subproj/CFCalendar.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,14 +236,23 @@ CFCalendarRef CFCalendarCopyCurrent(void) {
236236
}
237237

238238
Boolean _CFCalendarInitWithIdentifier(CFCalendarRef calendar, CFStringRef identifier) {
239-
if (identifier != kCFGregorianCalendar && identifier != kCFBuddhistCalendar && identifier != kCFJapaneseCalendar && identifier != kCFIslamicCalendar && identifier != kCFIslamicCivilCalendar && identifier != kCFHebrewCalendar && identifier != kCFChineseCalendar) {
239+
if (identifier != kCFGregorianCalendar && identifier != kCFBuddhistCalendar && identifier != kCFJapaneseCalendar && identifier != kCFIslamicCalendar && identifier != kCFIslamicCivilCalendar && identifier != kCFHebrewCalendar && identifier != kCFRepublicOfChinaCalendar && identifier != kCFPersianCalendar && identifier != kCFCalendarIdentifierCoptic && identifier != kCFCalendarIdentifierEthiopicAmeteMihret && identifier != kCFCalendarIdentifierEthiopicAmeteAlem && identifier != kCFChineseCalendar && identifier != kCFISO8601Calendar && identifier != kCFIslamicTabularCalendar && identifier != kCFIslamicUmmAlQuraCalendar) {
240240
if (CFEqual(kCFGregorianCalendar, identifier)) identifier = kCFGregorianCalendar;
241241
else if (CFEqual(kCFBuddhistCalendar, identifier)) identifier = kCFBuddhistCalendar;
242242
else if (CFEqual(kCFJapaneseCalendar, identifier)) identifier = kCFJapaneseCalendar;
243243
else if (CFEqual(kCFIslamicCalendar, identifier)) identifier = kCFIslamicCalendar;
244244
else if (CFEqual(kCFIslamicCivilCalendar, identifier)) identifier = kCFIslamicCivilCalendar;
245245
else if (CFEqual(kCFHebrewCalendar, identifier)) identifier = kCFHebrewCalendar;
246+
else if (CFEqual(kCFRepublicOfChinaCalendar, identifier)) identifier = kCFRepublicOfChinaCalendar;
247+
else if (CFEqual(kCFPersianCalendar, identifier)) identifier = kCFPersianCalendar;
248+
else if (CFEqual(kCFIndianCalendar, identifier)) identifier = kCFIndianCalendar;
249+
else if (CFEqual(kCFCalendarIdentifierCoptic, identifier)) identifier = kCFCalendarIdentifierCoptic;
250+
else if (CFEqual(kCFCalendarIdentifierEthiopicAmeteMihret, identifier)) identifier = kCFCalendarIdentifierEthiopicAmeteMihret;
251+
else if (CFEqual(kCFCalendarIdentifierEthiopicAmeteAlem, identifier)) identifier = kCFCalendarIdentifierEthiopicAmeteAlem;
246252
else if (CFEqual(kCFChineseCalendar, identifier)) identifier = kCFChineseCalendar;
253+
else if (CFEqual(kCFISO8601Calendar, identifier)) identifier = kCFISO8601Calendar;
254+
else if (CFEqual(kCFIslamicTabularCalendar, identifier)) identifier = kCFIslamicTabularCalendar;
255+
else if (CFEqual(kCFIslamicUmmAlQuraCalendar, identifier)) identifier = kCFIslamicUmmAlQuraCalendar;
247256
else return false;
248257
}
249258

CoreFoundation/Locale.subproj/CFLocaleKeys.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ CONST_STRING_DECL(kCFCalendarIdentifierChinese, "chinese");
126126
CONST_STRING_DECL(kCFCalendarIdentifierRepublicOfChina, "roc");
127127
CONST_STRING_DECL(kCFCalendarIdentifierPersian, "persian");
128128
CONST_STRING_DECL(kCFCalendarIdentifierIndian, "indian");
129-
CONST_STRING_DECL(kCFCalendarIdentifierISO8601, "");
129+
CONST_STRING_DECL(kCFCalendarIdentifierISO8601, "iso8601");
130130
CONST_STRING_DECL(kCFCalendarIdentifierCoptic, "coptic");
131131
CONST_STRING_DECL(kCFCalendarIdentifierEthiopicAmeteMihret, "ethiopic");
132132
CONST_STRING_DECL(kCFCalendarIdentifierEthiopicAmeteAlem, "ethiopic-amete-alem");

Foundation/NSCalendar.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ extension NSCalendar {
5353
public static let ethiopicAmeteMihret = NSCalendar.Identifier("ethiopic")
5454
public static let ethiopicAmeteAlem = NSCalendar.Identifier("ethiopic-amete-alem")
5555
public static let hebrew = NSCalendar.Identifier("hebrew")
56-
public static let ISO8601 = NSCalendar.Identifier("")
56+
public static let ISO8601 = NSCalendar.Identifier("iso8601")
5757
public static let indian = NSCalendar.Identifier("indian")
5858
public static let islamic = NSCalendar.Identifier("islamic")
5959
public static let islamicCivil = NSCalendar.Identifier("islamic-civil")

TestFoundation/TestNSCalendar.swift

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,42 @@ class TestNSCalendar: XCTestCase {
2020

2121
static var allTests: [(String, (TestNSCalendar) -> () throws -> Void)] {
2222
return [
23+
("test_allCalendars", test_allCalendars),
2324
("test_gettingDatesOnGregorianCalendar", test_gettingDatesOnGregorianCalendar ),
2425
("test_gettingDatesOnHebrewCalendar", test_gettingDatesOnHebrewCalendar ),
2526
("test_gettingDatesOnChineseCalendar", test_gettingDatesOnChineseCalendar),
27+
("test_gettingDatesOnISO8601Calendar", test_gettingDatesOnISO8601Calendar),
2628
("test_copy",test_copy),
2729
("test_addingDates", test_addingDates)
2830
// Disabled because this fails on linux https://bugs.swift.org/browse/SR-320
2931
// ("test_currentCalendarRRstability", test_currentCalendarRRstability),
3032
]
3133
}
3234

35+
func test_allCalendars() {
36+
for identifier in [
37+
Calendar.Identifier.buddhist,
38+
Calendar.Identifier.chinese,
39+
Calendar.Identifier.coptic,
40+
Calendar.Identifier.ethiopicAmeteAlem,
41+
Calendar.Identifier.ethiopicAmeteMihret,
42+
Calendar.Identifier.gregorian,
43+
Calendar.Identifier.hebrew,
44+
Calendar.Identifier.indian,
45+
Calendar.Identifier.islamic,
46+
Calendar.Identifier.islamicCivil,
47+
Calendar.Identifier.islamicTabular,
48+
Calendar.Identifier.islamicUmmAlQura,
49+
Calendar.Identifier.iso8601,
50+
Calendar.Identifier.japanese,
51+
Calendar.Identifier.persian,
52+
Calendar.Identifier.republicOfChina
53+
] {
54+
let calendar = Calendar(identifier: identifier)
55+
XCTAssertEqual(identifier,calendar.identifier)
56+
}
57+
}
58+
3359
func test_gettingDatesOnGregorianCalendar() {
3460
let date = Date(timeIntervalSince1970: 1449332351)
3561

@@ -41,6 +67,19 @@ class TestNSCalendar: XCTestCase {
4167
XCTAssertEqual(components.month, 12)
4268
XCTAssertEqual(components.day, 5)
4369
}
70+
71+
func test_gettingDatesOnISO8601Calendar() {
72+
let date = Date(timeIntervalSince1970: 1449332351)
73+
74+
var calendar = Calendar(identifier: .iso8601)
75+
calendar.timeZone = TimeZone(identifier: "UTC")!
76+
let components = calendar.dateComponents([.year, .month, .day], from: date)
77+
78+
XCTAssertEqual(components.year, 2015)
79+
XCTAssertEqual(components.month, 12)
80+
XCTAssertEqual(components.day, 5)
81+
}
82+
4483

4584
func test_gettingDatesOnHebrewCalendar() {
4685
let date = Date(timeIntervalSince1970: 1552580351)

0 commit comments

Comments
 (0)