28 @
typedef CPDateFormatterStyle
35 @
typedef CPDateFormatterBehavior
53 BOOL _allowNaturalLanguage;
54 BOOL _doesRelativeDateFormatting;
57 CPDateFormatterBehavior _formatterBehavior;
58 CPDateFormatterStyle _dateStyle;
59 CPDateFormatterStyle _timeStyle;
76 @"fr" : [@"demain", 1, @"apr" + String.fromCharCode(233) + @"s-demain", 2, @"apr" + String.fromCharCode(233) + @"s-apr" + String.fromCharCode(233) + @"s-demain", 3, @"hier", -1, @"avant-hier", -2, @"avant-avant-hier", -3],
77 @"en" : [@"tomorrow", 1, @"yesterday", -1],
82 patternStringTokens = [@"QQQ", @"qqq", @"QQQQ", @"qqqq", @"MMM", @"MMMM", @"LLL", @"LLLL", @"E", @"EE", @"EEE", @"eee", @"eeee", @"eeeee", @"a", @"z", @"zz", @"zzz", @"zzzz", @"Z", @"ZZ", @"ZZZ", @"ZZZZ", @"ZZZZZ", @"v", @"vv", @"vvv", @"vvvv", @"V", @"VV", @"VVV", @"VVVV"];
91 + (
CPString)localizedStringFromDate:(
CPDate)date dateStyle:(CPDateFormatterStyle)dateStyle timeStyle:(CPDateFormatterStyle)timeStyle
95 [formatter setFormatterBehavior:CPDateFormatterBehavior10_4];
96 [formatter setDateStyle:dateStyle];
97 [formatter setTimeStyle:timeStyle];
99 return [formatter stringForObjectValue:date];
117 + (CPDateFormatterBehavior)defaultFormatterBehavior
125 + (void)setDefaultFormatterBehavior:(CPDateFormatterBehavior)behavior
135 if (
self = [super
init])
151 - (id)initWithDateFormat:(
CPString)format allowNaturalLanguage:(BOOL)flag
153 if (
self = [
self init])
155 _dateFormat = format;
156 _allowNaturalLanguage = flag;
168 weekdaySymbols = [CPArray arrayWithObjects:@"Sunday", @"Monday", @"Tuesday", @"Wednesday", @"Thursday", @"Friday", @"Saturday"],
169 shortWeekdaySymbols = [CPArray arrayWithObjects:@"Sun", @"Mon", @"Tue", @"Wed", @"Thu", @"Fri", @"Sat"],
170 veryShortWeekdaySymbols = [CPArray arrayWithObjects:@"S", @"M", @"T", @"W", @"T", @"F", @"S"],
171 standaloneWeekdaySymbols = [CPArray arrayWithObjects:@"Sunday", @"Monday", @"Tuesday", @"Wednesday", @"Thursday", @"Friday", @"Saturday"],
172 shortStandaloneWeekdaySymbols = [CPArray arrayWithObjects:@"Sun", @"Mon", @"Tue", @"Wed", @"Thu", @"Fri", @"Sat"],
173 veryShortStandaloneWeekdaySymbols = [CPArray arrayWithObjects:@"S", @"M", @"T", @"W", @"T", @"F", @"S"],
174 monthSymbols = [CPArray arrayWithObjects:@"January", @"February", @"March", @"April", @"May", @"June", @"July", @"August", @"September", @"October", @"November", @"December"],
175 shortMonthSymbols = [CPArray arrayWithObjects:@"Jan", @"Feb", @"Mar", @"Apr", @"May", @"Jun", @"Jul", @"Aug", @"Sep", @"Oct", @"Nov", @"Dec"],
176 veryShortMonthSymbols = [CPArray arrayWithObjects:@"J", @"F", @"M", @"A", @"M", @"J", @"J", @"A", @"S", @"O", @"N", @"D"],
177 standaloneMonthSymbols = [CPArray arrayWithObjects:@"January", @"February", @"March", @"April", @"May", @"June", @"July", @"August", @"September", @"October", @"November", @"December"],
178 shortStandaloneMonthSymbols = [CPArray arrayWithObjects:@"Jan", @"Feb", @"Mar", @"Apr", @"May", @"Jun", @"Jul", @"Aug", @"Sep", @"Oct", @"Nov", @"Dec"],
179 veryShortStandaloneMonthSymbols = [CPArray arrayWithObjects:@"J", @"F", @"M", @"A", @"M", @"J", @"J", @"A", @"S", @"O", @"N", @"D"],
180 quarterSymbols = [CPArray arrayWithObjects:@"1st quarter", @"2nd quarter", @"3rd quarter", @"4th quarter"],
181 shortQuarterSymbols = [CPArray arrayWithObjects:@"Q1", @"Q2", @"Q3", @"Q4"],
182 standaloneQuarterSymbols = [CPArray arrayWithObjects:@"1st quarter", @"2nd quarter", @"3rd quarter", @"4th quarter"],
183 shortStandaloneQuarterSymbols = [CPArray arrayWithObjects:@"Q1", @"Q2", @"Q3", @"Q4"];
187 @"AMSymbol" : AMSymbol,
188 @"PMSymbol" : PMSymbol,
189 @"weekdaySymbols" : weekdaySymbols,
190 @"shortWeekdaySymbols" : shortWeekdaySymbols,
191 @"veryShortWeekdaySymbols" : veryShortWeekdaySymbols,
192 @"standaloneWeekdaySymbols" : standaloneWeekdaySymbols,
193 @"shortStandaloneWeekdaySymbols" : shortStandaloneWeekdaySymbols,
194 @"veryShortStandaloneWeekdaySymbols" : veryShortStandaloneWeekdaySymbols,
195 @"monthSymbols" : monthSymbols,
196 @"shortMonthSymbols" : shortMonthSymbols,
197 @"veryShortMonthSymbols" : veryShortMonthSymbols,
198 @"standaloneMonthSymbols" : standaloneMonthSymbols,
199 @"shortStandaloneMonthSymbols" : shortStandaloneMonthSymbols,
200 @"veryShortStandaloneMonthSymbols" : veryShortStandaloneMonthSymbols,
201 @"quarterSymbols" : quarterSymbols,
202 @"shortQuarterSymbols" : shortQuarterSymbols,
203 @"standaloneQuarterSymbols" : standaloneQuarterSymbols,
204 @"shortStandaloneQuarterSymbols" : shortStandaloneQuarterSymbols
210 _twoDigitStartDate = [[
CPDate alloc] initWithString:@"1950-01-01 00:00:00 +0000"];
216 #pragma mark Setter Getter Helper
222 var languageSymbols = [_symbols valueForKey:languageCode];
224 if (!languageSymbols)
230 return languageSymbols;
237 [_symbols setValue:symbols forKey:languageCode];
245 symbol = [languageSymbols valueForKey:aKey];
261 [languageSymbols setValue:aSymbol forKey:aKey];
265 #pragma mark Setter Getter
297 - (CPArray)weekdaySymbols
304 - (void)setWeekdaySymbols:(CPArray)aValue
311 - (CPArray)shortWeekdaySymbols
318 - (void)setShortWeekdaySymbols:(CPArray)aValue
325 - (CPArray)veryShortWeekdaySymbols
332 - (void)setVeryShortWeekdaySymbols:(CPArray)aValue
339 - (CPArray)standaloneWeekdaySymbols
346 - (void)setStandaloneWeekdaySymbols:(CPArray)aValue
353 - (CPArray)shortStandaloneWeekdaySymbols
355 return [
self symbolForKey:@"shortStandaloneWeekdaySymbols"
languageCode:[_locale objectForKey:CPLocaleLanguageCode]];
360 - (void)setShortStandaloneWeekdaySymbols:(CPArray)aValue
367 - (CPArray)veryShortStandaloneWeekdaySymbols
369 return [
self symbolForKey:@"veryShortStandaloneWeekdaySymbols"
languageCode:[_locale objectForKey:CPLocaleLanguageCode]];
374 - (void)setVeryShortStandaloneWeekdaySymbols:(CPArray)aValue
381 - (CPArray)monthSymbols
388 - (void)setMonthSymbols:(CPArray)aValue
395 - (CPArray)shortMonthSymbols
402 - (void)setShortMonthSymbols:(CPArray)aValue
409 - (CPArray)veryShortMonthSymbols
416 - (void)setVeryShortMonthSymbols:(CPArray)aValue
423 - (CPArray)standaloneMonthSymbols
430 - (void)setStandaloneMonthSymbols:(CPArray)aValue
437 - (CPArray)shortStandaloneMonthSymbols
444 - (void)setShortStandaloneMonthSymbols:(CPArray)aValue
451 - (CPArray)veryShortStandaloneMonthSymbols
453 return [
self symbolForKey:@"veryShortStandaloneMonthSymbols"
languageCode:[_locale objectForKey:CPLocaleLanguageCode]];
458 - (void)setVeryShortStandaloneMonthSymbols:(CPArray)aValue
465 - (CPArray)quarterSymbols
472 - (void)setQuarterSymbols:(CPArray)aValue
479 - (CPArray)shortQuarterSymbols
486 - (void)setShortQuarterSymbols:(CPArray)aValue
493 - (CPArray)standaloneQuarterSymbols
500 - (void)setStandaloneQuarterSymbols:(CPArray)aValue
507 - (CPArray)shortStandaloneQuarterSymbols
509 return [
self symbolForKey:@"shortStandaloneQuarterSymbols"
languageCode:[_locale objectForKey:CPLocaleLanguageCode]];
514 - (void)setShortStandaloneQuarterSymbols:(CPArray)aValue
521 #pragma mark StringFromDate methods
537 aDate = [aDate
copy];
538 [aDate _dateWithTimeZone:_timeZone];
541 return [
self _stringFromDate:aDate format:_dateFormat];
550 if ([
self _isAmericanFormat])
553 format =
@"dd/MM/yy";
558 if ([
self _isAmericanFormat])
559 format =
@"MMM d, Y";
566 if ([
self _isAmericanFormat])
567 format =
@"MMMM d, Y";
569 format =
@"d MMMM Y";
574 if ([
self _isAmericanFormat])
575 format =
@"EEEE, MMMM d, Y";
577 format =
@"EEEE d MMMM Y";
586 if ([
self doesRelativeDateFormatting])
588 var language = [_locale objectForKey:CPLocaleLanguageCode],
589 relativeWords = [relativeDateFormating valueForKey:language];
591 for (var i = 1; i < [relativeWords count]; i = i + 2)
594 [date _dateWithTimeZone:_timeZone];
600 date.setDate([relativeWords objectAtIndex:i] + date.getDate());
602 if (date.getDate() == aDate.getDate() && date.getMonth() == aDate.getMonth() && date.getFullYear() == aDate.getFullYear())
604 relativeWord = [relativeWords objectAtIndex:(i - 1)];
621 if ([
self _isEnglishFormat])
629 if ([
self _isEnglishFormat])
630 format +=
@"h:mm:ss a";
637 if ([
self _isEnglishFormat])
638 format +=
@"h:mm:ss a z";
640 format +=
@"H:mm:ss z";
645 if ([
self _isEnglishFormat])
646 format +=
@"h:mm:ss a zzzz";
648 format +=
@"h:mm:ss zzzz";
656 result = [
self _stringFromDate:aDate format:format];
659 result = relativeWord + result;
671 if ([anObject isKindOfClass:[
CPDate class]])
682 - (
CPString)editingStringForObjectValue:(
id)anObject
694 var length = [aFormat
length],
699 for (var i = 0; i < length; i++)
705 if ([character isEqualToString:
@"'"])
708 result += currentToken;
713 currentToken += character;
719 if ([character isEqualToString:
@"'"])
724 result += currentToken;
731 if ([character isEqualToString:
@","] || [character isEqualToString:
@":"] || [character isEqualToString:
@"/"] || [character isEqualToString:
@"-"] || [character isEqualToString:
@" "])
733 result += [self _stringFromToken:currentToken date:aDate];
739 if ([currentToken length] && ![[currentToken characterAtIndex:0] isEqualToString:character])
741 result += [self _stringFromToken:currentToken date:aDate];
745 currentToken += character;
747 if (i == (length - 1))
748 result += [self _stringFromToken:currentToken date:aDate];
762 if (![aToken length])
767 timeZone = _timeZone;
773 CPLog.warn(
@"Token not yet implemented " + aToken);
779 return [
self _stringValueForValue:aDate.getFullYear() length:(length == 2)?length:currentLength];
784 return [
self _stringValueForValue:aDate.getFullYear() length:(length == 2)?length:currentLength];
788 CPLog.warn(
@"Token not yet implemented " + aToken);
793 CPLog.warn(
@"Token not yet implemented " + aToken);
799 if (aDate.getMonth() < 6 && aDate.getMonth() > 2)
802 if (aDate.getMonth() > 5 && aDate.getMonth() < 9)
805 if (aDate.getMonth() >= 9)
809 return [
self _stringValueForValue:quarter length:MIN(2,length)];
812 return [[
self shortQuarterSymbols] objectAtIndex:(quarter - 1)];
815 return [[
self quarterSymbols] objectAtIndex:(quarter - 1)];
820 if (aDate.getMonth() < 6 && aDate.getMonth() > 2)
823 if (aDate.getMonth() > 5 && aDate.getMonth() < 9)
826 if (aDate.getMonth() >= 9)
830 return [
self _stringValueForValue:quarter length:MIN(2,length)];
833 return [[
self shortStandaloneQuarterSymbols] objectAtIndex:(quarter - 1)];
836 return [[
self standaloneQuarterSymbols] objectAtIndex:(quarter - 1)];
842 return [
self _stringValueForValue:(aDate.getMonth() + 1) length:MAX(currentLength,length)];
845 return [[
self shortMonthSymbols] objectAtIndex:aDate.getMonth()];
848 return [[
self monthSymbols] objectAtIndex:aDate.getMonth()];
851 return [[
self veryShortMonthSymbols] objectAtIndex:aDate.getMonth()];
857 return [
self _stringValueForValue:(aDate.getMonth() + 1) length:MAX(currentLength,length)];
860 return [[
self shortStandaloneMonthSymbols] objectAtIndex:aDate.getMonth()];
863 return [[
self standaloneMonthSymbols] objectAtIndex:aDate.getMonth()];
866 return [[
self veryShortStandaloneMonthSymbols] objectAtIndex:aDate.getMonth()];
870 CPLog.warn(
@"Depreacted - Token not yet implemented " + aToken);
874 var d = [aDate
copy];
877 d.setDate(d.getDate() + 4 - (d.getDay() || 7));
879 var yearStart =
new Date(d.getFullYear(), 0, 1),
880 weekOfYear = Math.ceil((((d - yearStart) / 86400000) + 1) / 7);
882 return [
self _stringValueForValue:(weekOfYear + 1) length:MAX(2, length)];
885 var firstDay =
new Date(aDate.getFullYear(), aDate.getMonth(), 1).getDay(),
886 weekOfMonth = Math.ceil((aDate.getDate() + firstDay) / 7);
888 return [
self _stringValueForValue:weekOfMonth length:1];
893 return [
self _stringValueForValue:aDate.getDate() length:MAX(length, currentLength)];
896 var oneJan =
new Date(aDate.getFullYear(), 0, 1),
897 dayOfYear = Math.ceil((aDate - oneJan) / 86400000),
900 return [
self _stringValueForValue:dayOfYear length:MAX(currentLength, MIN(3, length))];
904 day = aDate.getDate();
906 if (day > 7 && day < 15)
909 if (day > 14 && day < 22)
912 if (day > 21 && day < 29)
918 return [
self _stringValueForValue:dayOfWeek length:1];
921 CPLog.warn(
@"Token not yet implemented " + aToken);
925 var day = aDate.getDay();
928 return [[
self shortWeekdaySymbols] objectAtIndex:day];
931 return [[
self weekdaySymbols] objectAtIndex:day];
934 return [[
self veryShortWeekdaySymbols] objectAtIndex:day];
937 var day = aDate.getDay();
940 return [
self _stringValueForValue:(day + 1) length:MIN(2, length)];
943 return [[
self shortWeekdaySymbols] objectAtIndex:day];
946 return [[
self weekdaySymbols] objectAtIndex:day];
949 return [[
self veryShortWeekdaySymbols] objectAtIndex:day];
952 var day = aDate.getDay();
955 return [
self _stringValueForValue:(day + 1) length:aDate.getDay().toString().length];
958 return [[
self shortStandaloneWeekdaySymbols] objectAtIndex:day];
961 return [[
self standaloneWeekdaySymbols] objectAtIndex:day];
964 return [[
self veryShortStandaloneWeekdaySymbols] objectAtIndex:day];
968 if (aDate.getHours() > 11)
969 return [
self PMSymbol];
971 return [
self AMSymbol];
974 var hours = aDate.getHours();
976 if ([
self _isAmericanFormat] || [
self _isEnglishFormat])
986 return [
self _stringValueForValue:hours length:MAX(currentLength, MIN(2, length))];
991 return [
self _stringValueForValue:aDate.getHours() length:MAX(currentLength, MIN(2, length))];
994 var hours = aDate.getHours();
1001 return [
self _stringValueForValue:hours length:MAX(currentLength, MIN(2, length))];
1004 var hours = aDate.getHours();
1006 if (aDate.getHours() == 0)
1011 return [
self _stringValueForValue:hours length:MAX(currentLength, MIN(2, length))];
1014 CPLog.warn(
@"Token not yet implemented " + aToken);
1020 return [
self _stringValueForValue:aDate.getMinutes() length:MAX(currentLength, MIN(2, length))];
1025 return [
self _stringValueForValue:aDate.getSeconds() length:MIN(2, length)];
1028 return [
self _stringValueForValue:aDate.getMilliseconds() length:length];
1031 var value = aDate.getHours() * 60 * 60 * 1000 + aDate.getMinutes() * 60 * 1000 + aDate.getSeconds() * 1000 + aDate.getMilliseconds();
1033 return [
self _stringValueForValue:value length:value.toString().length];
1037 return [timeZone localizedName:CPTimeZoneNameStyleShortDaylightSaving locale:_locale];
1039 return [timeZone localizedName:CPTimeZoneNameStyleDaylightSaving locale:_locale];
1042 var seconds = [timeZone secondsFromGMT],
1043 minutes = seconds / 60,
1044 hours = minutes / 60,
1046 diffMinutes = (hours - parseInt(hours)) * 100 * 60 / 100;
1050 result = diffMinutes.toString();
1052 while ([result length] < 2)
1053 result =
@"0" + result;
1055 result = ABS(parseInt(hours)) + result;
1057 while ([result length] < 4)
1058 result =
@"0" + result;
1061 result =
@"+" + result;
1063 result =
@"-" + result;
1067 else if (length == 4)
1069 result = diffMinutes.toString();
1071 while ([result length] < 2)
1072 result =
@"0" + result;
1074 result =
@":" + result;
1075 result = ABS(parseInt(hours)) + result;
1077 while ([result length] < 5)
1078 result =
@"0" + result;
1081 result =
@"+" + result;
1083 result =
@"-" + result;
1085 return @"GMT" + result;
1089 result = diffMinutes.toString();
1091 while ([result length] < 2)
1092 result =
@"0" + result;
1094 result =
@":" + result;
1095 result = ABS(parseInt(hours)) + result;
1097 while ([result length] < 5)
1098 result =
@"0" + result;
1101 result =
@"+" + result;
1103 result =
@"-" + result;
1110 return [timeZone localizedName:CPTimeZoneNameStyleShortGeneric locale:_locale];
1111 else if (length == 4)
1112 return [timeZone localizedName:CPTimeZoneNameStyleGeneric locale:_locale];
1119 return [timeZone localizedName:CPTimeZoneNameStyleShortDaylightSaving locale:_locale];
1121 else if (length == 4)
1123 CPLog.warn(
@"No pattern found for " + aToken);
1130 CPLog.warn(
@"No pattern found for " + aToken);
1139 #pragma mark datefromString
1150 if (_dateFormat != nil)
1151 return [
self _dateFromString:aString format:_dateFormat];
1160 if ([
self _isAmericanFormat])
1163 format =
@"dd/MM/yy";
1168 if ([
self _isAmericanFormat])
1169 format =
@"MMM d, Y";
1171 format =
@"d MMM Y";
1176 if ([
self _isAmericanFormat])
1177 format =
@"MMMM d, Y";
1179 format =
@"d MMMM Y";
1184 if ([
self _isAmericanFormat])
1185 format =
@"EEEE, MMMM d, Y";
1187 format =
@"EEEE d MMMM Y";
1202 if ([
self _isEnglishFormat])
1203 format +=
@" h:mm a";
1209 if ([
self _isEnglishFormat])
1210 format +=
@" h:mm:ss a";
1212 format +=
@" H:mm:ss"
1216 if ([
self _isEnglishFormat])
1217 format +=
@" h:mm:ss a z";
1219 format +=
@" H:mm:ss z";
1223 if ([
self _isEnglishFormat])
1224 format +=
@" h:mm:ss a zzzz";
1226 format +=
@" h:mm:ss zzzz";
1233 return [
self _dateFromString:aString format:format];
1242 - (BOOL)getObjectValue:(idRef)anObject forString:(
CPString)aString errorDescription:(CPStringRef)anError
1245 @deref(anObject) = value;
1250 @deref(anError) =
@"The value \"" + aString + "\
" is invalid.";
1274 tokens = [CPArray array],
1275 dateComponents = [CPArray array],
1276 patternTokens = [CPArray array];
1278 for (var i = 0; i < [aFormat
length]; i++)
1284 if ([character isEqualToString:
@"'"])
1290 if ([character isEqualToString:
@"'"])
1298 if ([character isEqualToString:
@","] || [character isEqualToString:
@":"] || [character isEqualToString:
@"/"] || [character isEqualToString:
@"-"] || [character isEqualToString:
@" "])
1300 [tokens addObject:currentToken];
1303 [patternTokens addObject:[tokens count] - 1];
1309 if ([currentToken length] && ![[currentToken characterAtIndex:0] isEqualToString:character])
1311 [tokens addObject:currentToken];
1314 [patternTokens addObject:[tokens count] - 1];
1319 currentToken += character;
1321 if (i == ([aFormat length] - 1))
1323 [tokens addObject:currentToken];
1326 [patternTokens addObject:[tokens count] - 1];
1334 var currentIndexSpecialPattern = 0;
1336 if ([patternTokens count] == 0)
1339 for (var i = 0; i < [aString
length]; i++)
1345 if ([character isEqualToString:
@"'"])
1351 if ([character isEqualToString:
@"'"])
1360 if ([dateComponents count] == [patternTokens objectAtIndex:currentIndexSpecialPattern])
1362 var j = [
self _lastIndexMatchedString:aString token:[tokens objectAtIndex:[dateComponents count]] index:i];
1367 currentIndexSpecialPattern++;
1374 if ([character isEqualToString:
@","] || [character isEqualToString:
@":"] || [character isEqualToString:
@"/"] || [character isEqualToString:
@"-"] || [character isEqualToString:
@" "])
1376 [dateComponents addObject:currentToken];
1381 currentToken += character;
1383 if (i == ([aString length] - 1))
1384 [dateComponents addObject:currentToken];
1388 if ([dateComponents count] != [tokens count])
1391 return [
self _dateFromTokens:tokens dateComponents:dateComponents];
1394 - (
CPDate)_dateFromTokens:(CPArray)tokens dateComponents:(CPArray)dateComponents
1396 var timeZoneseconds = [_timeZone secondsFromGMT],
1397 dateArray = [2000, 01, 01, 00, 00, 00, @"+0000"],
1404 for (var i = 0; i < [tokens count]; i++)
1406 var token = [tokens objectAtIndex:i],
1407 dateComponent = [dateComponents objectAtIndex:i],
1408 character = [token characterAtIndex:0],
1409 length = [token length];
1415 CPLog.warn(
@"Token not yet implemented " + token);
1419 var u = _twoDigitStartDate.getFullYear() % 10,
1420 d = parseInt(_twoDigitStartDate.getFullYear() / 10) % 10,
1421 c = parseInt(_twoDigitStartDate.getFullYear() / 100) % 10,
1422 m = parseInt(_twoDigitStartDate.getFullYear() / 1000) % 10;
1424 if (length == 2 && dateComponent.length == 2)
1426 if ((u + d * 10) >= parseInt(dateComponent))
1427 dateArray[0] = (c + 1) * 100 + m * 1000 + parseInt(dateComponent);
1429 dateArray[0] = c * 100 + m * 1000 + parseInt(dateComponent);
1433 dateArray[0] = parseInt(dateComponent);
1439 var u = _twoDigitStartDate.getFullYear() % 10,
1440 d = parseInt(_twoDigitStartDate.getFullYear() / 10) % 10,
1441 c = parseInt(_twoDigitStartDate.getFullYear() / 100) % 10,
1442 m = parseInt(_twoDigitStartDate.getFullYear() / 1000) % 10;
1444 if (length == 2 && dateComponent.length == 2)
1446 if ((u + d * 10) >= parseInt(dateComponent))
1447 dateArray[0] = (c + 1) * 100 + m * 1000 + parseInt(dateComponent);
1449 dateArray[0] = c * 100 + m * 1000 + parseInt(dateComponent);
1453 dateArray[0] = parseInt(dateComponent);
1460 CPLog.warn(
@"Token not yet implemented " + token);
1465 CPLog.warn(
@"Token not yet implemented " + token);
1472 month = (parseInt(dateComponent) - 1) * 3;
1476 if (![[
self shortQuarterSymbols] containsObject:dateComponent])
1479 month = [[
self shortQuarterSymbols] indexOfObject:dateComponent] * 3;
1484 if (![[
self quarterSymbols] containsObject:dateComponent])
1487 month = [[
self quarterSymbols] indexOfObject:dateComponent] * 3;
1493 dateArray[1] = month + 1;
1500 month = (parseInt(dateComponent) - 1) * 3;
1504 if (![[
self shortQuarterSymbols] containsObject:dateComponent])
1507 month = [[
self shortQuarterSymbols] indexOfObject:dateComponent] * 3;
1512 if (![[
self quarterSymbols] containsObject:dateComponent])
1515 month = [[
self quarterSymbols] indexOfObject:dateComponent] * 3;
1521 dateArray[1] = month + 1;
1528 month = parseInt(dateComponent)
1532 if (![[
self shortMonthSymbols] containsObject:dateComponent])
1535 month = [[
self shortMonthSymbols] indexOfObject:dateComponent] + 1;
1540 if (![[
self monthSymbols] containsObject:dateComponent])
1543 month = [[
self monthSymbols] indexOfObject:dateComponent] + 1;
1546 if (month > 11 || length >= 5)
1549 dateArray[1] = month;
1556 month = parseInt(dateComponent);
1560 if (![[
self shortStandaloneMonthSymbols] containsObject:dateComponent])
1563 month = [[
self shortStandaloneMonthSymbols] indexOfObject:dateComponent] + 1;
1568 if (![[
self standaloneMonthSymbols] containsObject:dateComponent])
1571 month = [[
self standaloneMonthSymbols] indexOfObject:dateComponent] + 1;
1574 if (month > 11 || length >= 5)
1577 dateArray[1] = month;
1582 CPLog.warn(
@"Depreacted - Token not yet implemented " + token);
1586 if (dateComponent > 52)
1589 weekOfYear = dateComponent;
1593 if (dateComponent > 52)
1596 weekOfMonth = dateComponent;
1600 dateArray[2] = parseInt(dateComponent);
1604 if (isNaN(parseInt(dateComponent)) || parseInt(dateComponent) > 345)
1607 dayOfYear = parseInt(dateComponent);
1611 if (isNaN(parseInt(dateComponent)) || parseInt(dateComponent) > 5 || parseInt(dateComponent) == 0)
1614 if (parseInt(dateComponent) == 1)
1617 if (parseInt(dateComponent) == 2)
1620 if (parseInt(dateComponent) == 3)
1623 if (parseInt(dateComponent) == 4)
1626 if (parseInt(dateComponent) == 5)
1632 CPLog.warn(
@"Token not yet implemented " + token);
1637 dayIndexInWeek = [[
self shortWeekdaySymbols] indexOfObject:dateComponent];
1640 dayIndexInWeek = [[
self weekdaySymbols] indexOfObject:dateComponent];
1642 if (dayIndexInWeek ==
CPNotFound || length >= 5)
1648 if (length <= 2 && isNaN(parseInt(dateComponent)))
1652 dayIndexInWeek = parseInt(dateComponent);
1655 dayIndexInWeek = [[
self shortWeekdaySymbols] indexOfObject:dateComponent];
1658 dayIndexInWeek = [[
self weekdaySymbols] indexOfObject:dateComponent];
1660 if (dayIndexInWeek ==
CPNotFound || length >= 5)
1666 if (length <= 2 && isNaN(parseInt(dateComponent)))
1670 dayIndexInWeek = dateComponent;
1673 dayIndexInWeek = [[
self shortStandaloneWeekdaySymbols] indexOfObject:dateComponent];
1676 dayIndexInWeek = [[
self standaloneWeekdaySymbols] indexOfObject:dateComponent];
1679 dayIndexInWeek = [[
self veryShortStandaloneWeekdaySymbols] indexOfObject:dateComponent];
1681 if (dayIndexInWeek ==
CPNotFound || length >= 5)
1687 if (![dateComponent isEqualToString:[
self PMSymbol]] && ![dateComponent isEqualToString:[
self AMSymbol]])
1690 if ([dateComponent isEqualToString:[
self PMSymbol]])
1696 if (parseInt(dateComponent) < 0 || parseInt(dateComponent) > 12)
1699 dateArray[3] = parseInt(dateComponent);
1703 if (parseInt(dateComponent) < 0 || parseInt(dateComponent) > 23)
1706 dateArray[3] = parseInt(dateComponent);
1710 if (parseInt(dateComponent) < 0 || parseInt(dateComponent) > 11)
1713 dateArray[3] = parseInt(dateComponent);
1717 if (parseInt(dateComponent) < 0 || parseInt(dateComponent) > 12)
1720 dateArray[3] = parseInt(dateComponent);
1724 CPLog.warn(
@"Token not yet implemented " + token);
1728 var minutes = parseInt(dateComponent);
1733 dateArray[4] = minutes;
1737 var seconds = parseInt(dateComponent);
1742 dateArray[5] = seconds;
1746 if (isNaN(parseInt(dateComponent)))
1752 if (isNaN(parseInt(dateComponent)))
1755 var millisecondsInDay = parseInt(dateComponent),
1756 tmpDate =
new Date();
1758 tmpDate.setHours(0);
1759 tmpDate.setMinutes(0);
1760 tmpDate.setSeconds(0);
1761 tmpDate.setMilliseconds(0);
1763 tmpDate.setMilliseconds(millisecondsInDay);
1765 dateArray[3] = tmpDate.getHours();
1766 dateArray[4] = tmpDate.getMinutes();
1767 dateArray[5] = tmpDate.getSeconds();
1772 timeZoneseconds = [
self _secondsFromTimeZoneString:dateComponent style:CPTimeZoneNameStyleShortDaylightSaving];
1774 timeZoneseconds = [
self _secondsFromTimeZoneString:dateComponent style:CPTimeZoneNameStyleDaylightSaving];
1776 if (!timeZoneseconds)
1777 timeZoneseconds = [
self _secondsFromTimeZoneDefaultFormatString:dateComponent];
1779 if (!timeZoneseconds)
1782 timeZoneseconds = timeZoneseconds + 60 * 60;
1787 timeZoneseconds = [
self _secondsFromTimeZoneDefaultFormatString:dateComponent];
1789 if (!timeZoneseconds)
1792 timeZoneseconds = timeZoneseconds + 60 * 60;
1798 timeZoneseconds = [
self _secondsFromTimeZoneString:dateComponent style:CPTimeZoneNameStyleShortGeneric];
1800 timeZoneseconds = [
self _secondsFromTimeZoneString:dateComponent style:CPTimeZoneNameStyleGeneric];
1802 if (!timeZoneseconds && length == 4)
1803 timeZoneseconds = [
self _secondsFromTimeZoneDefaultFormatString:dateComponent];
1805 if (!timeZoneseconds)
1808 timeZoneseconds = timeZoneseconds + 60 * 60;
1814 timeZoneseconds = [
self _secondsFromTimeZoneString:dateComponent style:CPTimeZoneNameStyleShortStandard];
1816 timeZoneseconds = [
self _secondsFromTimeZoneString:dateComponent style:CPTimeZoneNameStyleStandard];
1818 if (!timeZoneseconds)
1819 timeZoneseconds = [
self _secondsFromTimeZoneDefaultFormatString:dateComponent];
1821 if (!timeZoneseconds)
1824 timeZoneseconds = timeZoneseconds + 60 * 60;
1829 CPLog.warn(
@"No pattern found for " + token);
1837 var tmpDate =
new Date();
1838 tmpDate.setFullYear(dateArray[0]);
1839 tmpDate.setMonth(0);
1841 tmpDate.setDate(dayOfYear)
1843 dateArray[1] = tmpDate.getMonth() + 1;
1844 dateArray[2] = tmpDate.getDate();
1848 dateArray[2] = (weekOfMonth - 1) * 7 + 1;
1852 var tmpDate =
new Date();
1853 tmpDate.setFullYear(dateArray[0]);
1854 tmpDate.setMonth(0);
1857 while (tmpDate.getDay() != 0)
1858 tmpDate.setDate(tmpDate.getDate() + 1);
1860 tmpDate.setDate(tmpDate.getDate() + (weekOfYear - 1) * 7);
1862 dateArray[1] = tmpDate.getMonth() + 1;
1863 dateArray[2] = tmpDate.getDate() - 1;
1867 var tmpDate =
new Date();
1868 tmpDate.setMonth(dateArray[1] - 1);
1869 tmpDate.setFullYear(dateArray[0]);
1871 if (dateArray[2] <= 0 || dateArray[2] > [tmpDate _daysInMonth])
1878 if (isNaN(parseInt(dateArray[0])) || isNaN(parseInt(dateArray[1])) || isNaN(parseInt(dateArray[2])) || isNaN(parseInt(dateArray[3])) || isNaN(parseInt(dateArray[4])) || isNaN(parseInt(dateArray[5])) || isNaN(parseInt(dateArray[6])))
1881 var dateResult = [[
CPDate alloc] initWithString:[
CPString stringWithFormat:@"%04d-%02d-%02d %02d:%02d:%02d %s", dateArray[0], dateArray[1], dateArray[2], dateArray[3], dateArray[4], dateArray[5], dateArray[6]]];
1882 dateResult.setSeconds(dateResult.getSeconds() - timeZoneseconds + 60 * 60);
1891 - (
CPString)_stringValueForValue:(
id)aValue length:(
int)length
1895 if ([
string length] == length)
1898 if ([
string length] > length)
1899 return [string substringFromIndex:([string length] - length)];
1901 while ([
string length] < length)
1909 - (BOOL)_isAmericanFormat
1911 return [[_locale objectForKey:CPLocaleCountryCode] isEqualToString:@"US"];
1916 - (BOOL)_isEnglishFormat
1918 return [[_locale objectForKey:CPLocaleLanguageCode] isEqualToString:@"en"];
1923 - (int)_secondsFromTimeZoneDefaultFormatString:(
CPString)aTimeZoneFormatString
1925 var format = /\w*([HPG-GMT])?([+-])(\d{1,2})([:])?(\d{2})\w*/,
1926 result = aTimeZoneFormatString.match(
new RegExp(format)),
1932 seconds = result[3] * 60 * 60 + result[5] * 60;
1934 if ([result[2] isEqualToString:
@"-"])
1942 - (int)_secondsFromTimeZoneString:(
CPString)aTimeZoneString style:(NSTimeZoneNameStyle)aStyle
1944 var timeZone = [
CPTimeZone _timeZoneFromString:aTimeZoneString style:aStyle locale:_locale];
1949 return [timeZone secondsFromGMT];
1958 - (int)_lastIndexMatchedString:(
CPString)aString token:(
CPString)aToken index:anIndex
1961 length = [aToken
length],
1963 format = /\w*([HPG-GMT])?([+-])(\d{1,2})([:])?(\d{2})\w*/,
1964 result = aString.match(
new RegExp(format));
1970 targetedArray = [
self shortQuarterSymbols];
1973 targetedArray = [
self quarterSymbols];
1979 targetedArray = [
self shortStandaloneQuarterSymbols];
1982 targetedArray = [
self standaloneQuarterSymbols];
1988 targetedArray = [
self shortMonthSymbols];
1991 targetedArray = [
self monthSymbols];
1994 targetedArray = [
self veryShortMonthSymbols];
2000 targetedArray = [
self shortStandaloneMonthSymbols];
2003 targetedArray = [
self standaloneMonthSymbols];
2006 targetedArray = [
self veryShortStandaloneMonthSymbols];
2012 targetedArray = [
self shortWeekdaySymbols];
2015 targetedArray = [
self weekdaySymbols];
2018 targetedArray = [
self veryShortWeekdaySymbols];
2024 targetedArray = [
self shortWeekdaySymbols];
2027 targetedArray = [
self weekdaySymbols];
2030 targetedArray = [
self veryShortWeekdaySymbols];
2036 targetedArray = [
self shortStandaloneWeekdaySymbols];
2039 targetedArray = [
self standaloneWeekdaySymbols];
2042 targetedArray = [
self veryShortStandaloneWeekdaySymbols];
2047 targetedArray = [[
self PMSymbol], [
self AMSymbol]];
2052 targetedArray = [
CPTimeZone _namesForStyle:CPTimeZoneNameStyleShortDaylightSaving locale:_locale];
2054 targetedArray = [
CPTimeZone _namesForStyle:CPTimeZoneNameStyleDaylightSaving locale:_locale];
2057 return anIndex + [result objectAtIndex:0].length;
2063 return anIndex + [result objectAtIndex:0].length;
2069 targetedArray = [
CPTimeZone _namesForStyle:CPTimeZoneNameStyleShortGeneric locale:_locale];
2070 else if (length == 4)
2071 targetedArray = [
CPTimeZone _namesForStyle:CPTimeZoneNameStyleGeneric locale:_locale];
2074 return anIndex + [result objectAtIndex:0].length;
2080 targetedArray = [
CPTimeZone _namesForStyle:CPTimeZoneNameStyleShortStandard locale:_locale];
2083 return anIndex + [result objectAtIndex:0].length;
2088 CPLog.warn(
@"No pattern found for " + aToken);
2092 for (var i = 0; i < [targetedArray count]; i++)
2094 var currentObject = [targetedArray objectAtIndex:i],
2097 if (range.length == 0)
2100 character = [aString characterAtIndex:(anIndex + range.length)];
2102 if ([character isEqualToString:
@"'"] || [character isEqualToString:
@","] || [character isEqualToString:
@":"] || [character isEqualToString:
@"/"] || [character isEqualToString:
@"-"] || [character isEqualToString:
@" "] || [character isEqualToString:
@""])
2103 return anIndex + range.length;
2127 _allowNaturalLanguage = [aCoder decodeBoolForKey:CPDateFormatterAllowNaturalLanguageKey];
2128 _dateFormat = [aCoder decodeObjectForKey:CPDateFormatterDateFormatKey];
2129 _dateStyle = [aCoder decodeIntForKey:CPDateFormatterDateStyleKey];
2130 _doesRelativeDateFormatting = [aCoder decodeBoolForKey:CPDateFormatterDoseRelativeDateFormattingKey];
2131 _formatterBehavior = [aCoder decodeIntForKey:CPDateFormatterFormatterBehaviorKey];
2132 _locale = [aCoder decodeObjectForKey:CPDateFormatterLocaleKey];
2133 _timeStyle = [aCoder decodeIntForKey:CPDateFormatterTimeStyleKey];
2145 [aCoder encodeBool:_allowNaturalLanguage forKey:CPDateFormatterAllowNaturalLanguageKey];
2146 [aCoder encodeInt:_dateStyle forKey:CPDateFormatterDateStyleKey];
2147 [aCoder encodeObject:_dateFormat forKey:CPDateFormatterDateFormatKey];
2148 [aCoder encodeBool:_doesRelativeDateFormatting forKey:CPDateFormatterDoseRelativeDateFormattingKey];
2149 [aCoder encodeInt:_formatterBehavior forKey:CPDateFormatterFormatterBehaviorKey];
2150 [aCoder encodeInt:_locale forKey:CPDateFormatterLocaleKey];
2151 [aCoder encodeInt:_timeStyle forKey:CPDateFormatterTimeStyleKey];
2161 - (void)_dateWithTimeZone:(
CPTimeZone)aTimeZone
2166 self.setSeconds(
self.getSeconds() - [aTimeZone secondsFromGMTForDate:
self]);
2167 self.setSeconds(
self.getSeconds() + [aTimeZone secondsFromGMT]);
2177 - (BOOL)allowNaturalLanguage
2179 return _allowNaturalLanguage;
2185 - (BOOL)doesRelativeDateFormatting
2187 return _doesRelativeDateFormatting;
2193 - (void)setDoesRelativeDateFormatting:(BOOL)aValue
2195 _doesRelativeDateFormatting = aValue;
2203 return _defaultDate;
2211 _defaultDate = aValue;
2219 return _twoDigitStartDate;
2227 _twoDigitStartDate = aValue;
2233 - (CPDateFormatterBehavior)formatterBehavior
2235 return _formatterBehavior;
2241 - (void)setFormatterBehavior:(CPDateFormatterBehavior)aValue
2243 _formatterBehavior = aValue;
2249 - (CPDateFormatterStyle)dateStyle
2257 - (void)setDateStyle:(CPDateFormatterStyle)aValue
2259 _dateStyle = aValue;
2265 - (CPDateFormatterStyle)timeStyle
2273 - (void)setTimeStyle:(CPDateFormatterStyle)aValue
2275 _timeStyle = aValue;
2323 _dateFormat = aValue;