28 @
typedef CPDateFormatterStyle
35 @
typedef CPDateFormatterBehavior
44 var _separatorsCharacterSet = nil;
55 BOOL _allowNaturalLanguage;
56 BOOL _doesRelativeDateFormatting;
59 CPDateFormatterBehavior _formatterBehavior;
60 CPDateFormatterStyle _dateStyle;
61 CPDateFormatterStyle _timeStyle;
78 @"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],
79 @"en" : [@"tomorrow", 1, @"yesterday", -1],
80 @"de" : [@"morgen", 1, @"gestern", -1, String.fromCharCode(129) + @"bermorgen", 2, @"vorgestern", -2],
84 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"];
93 + (
CPString)localizedStringFromDate:(
CPDate)date dateStyle:(CPDateFormatterStyle)dateStyle timeStyle:(CPDateFormatterStyle)timeStyle
97 [formatter setFormatterBehavior:CPDateFormatterBehavior10_4];
98 [formatter setDateStyle:dateStyle];
99 [formatter setTimeStyle:timeStyle];
101 return [formatter stringForObjectValue:date];
119 + (CPDateFormatterBehavior)defaultFormatterBehavior
127 + (void)setDefaultFormatterBehavior:(CPDateFormatterBehavior)behavior
134 if (_separatorsCharacterSet == nil)
137 return _separatorsCharacterSet;
145 if (
self = [super
init])
161 - (id)initWithDateFormat:(
CPString)format allowNaturalLanguage:(BOOL)flag
163 if (
self = [
self init])
165 _dateFormat = format;
166 _allowNaturalLanguage = flag;
178 weekdaySymbols = [CPArray arrayWithObjects:@"Sunday", @"Monday", @"Tuesday", @"Wednesday", @"Thursday", @"Friday", @"Saturday"],
179 shortWeekdaySymbols = [CPArray arrayWithObjects:@"Sun", @"Mon", @"Tue", @"Wed", @"Thu", @"Fri", @"Sat"],
180 veryShortWeekdaySymbols = [CPArray arrayWithObjects:@"S", @"M", @"T", @"W", @"T", @"F", @"S"],
181 standaloneWeekdaySymbols = [CPArray arrayWithObjects:@"Sunday", @"Monday", @"Tuesday", @"Wednesday", @"Thursday", @"Friday", @"Saturday"],
182 shortStandaloneWeekdaySymbols = [CPArray arrayWithObjects:@"Sun", @"Mon", @"Tue", @"Wed", @"Thu", @"Fri", @"Sat"],
183 veryShortStandaloneWeekdaySymbols = [CPArray arrayWithObjects:@"S", @"M", @"T", @"W", @"T", @"F", @"S"],
184 monthSymbols = [CPArray arrayWithObjects:@"January", @"February", @"March", @"April", @"May", @"June", @"July", @"August", @"September", @"October", @"November", @"December"],
185 shortMonthSymbols = [CPArray arrayWithObjects:@"Jan", @"Feb", @"Mar", @"Apr", @"May", @"Jun", @"Jul", @"Aug", @"Sep", @"Oct", @"Nov", @"Dec"],
186 veryShortMonthSymbols = [CPArray arrayWithObjects:@"J", @"F", @"M", @"A", @"M", @"J", @"J", @"A", @"S", @"O", @"N", @"D"],
187 standaloneMonthSymbols = [CPArray arrayWithObjects:@"January", @"February", @"March", @"April", @"May", @"June", @"July", @"August", @"September", @"October", @"November", @"December"],
188 shortStandaloneMonthSymbols = [CPArray arrayWithObjects:@"Jan", @"Feb", @"Mar", @"Apr", @"May", @"Jun", @"Jul", @"Aug", @"Sep", @"Oct", @"Nov", @"Dec"],
189 veryShortStandaloneMonthSymbols = [CPArray arrayWithObjects:@"J", @"F", @"M", @"A", @"M", @"J", @"J", @"A", @"S", @"O", @"N", @"D"],
190 quarterSymbols = [CPArray arrayWithObjects:@"1st quarter", @"2nd quarter", @"3rd quarter", @"4th quarter"],
191 shortQuarterSymbols = [CPArray arrayWithObjects:@"Q1", @"Q2", @"Q3", @"Q4"],
192 standaloneQuarterSymbols = [CPArray arrayWithObjects:@"1st quarter", @"2nd quarter", @"3rd quarter", @"4th quarter"],
193 shortStandaloneQuarterSymbols = [CPArray arrayWithObjects:@"Q1", @"Q2", @"Q3", @"Q4"];
197 @"AMSymbol" : AMSymbol,
198 @"PMSymbol" : PMSymbol,
199 @"weekdaySymbols" : weekdaySymbols,
200 @"shortWeekdaySymbols" : shortWeekdaySymbols,
201 @"veryShortWeekdaySymbols" : veryShortWeekdaySymbols,
202 @"standaloneWeekdaySymbols" : standaloneWeekdaySymbols,
203 @"shortStandaloneWeekdaySymbols" : shortStandaloneWeekdaySymbols,
204 @"veryShortStandaloneWeekdaySymbols" : veryShortStandaloneWeekdaySymbols,
205 @"monthSymbols" : monthSymbols,
206 @"shortMonthSymbols" : shortMonthSymbols,
207 @"veryShortMonthSymbols" : veryShortMonthSymbols,
208 @"standaloneMonthSymbols" : standaloneMonthSymbols,
209 @"shortStandaloneMonthSymbols" : shortStandaloneMonthSymbols,
210 @"veryShortStandaloneMonthSymbols" : veryShortStandaloneMonthSymbols,
211 @"quarterSymbols" : quarterSymbols,
212 @"shortQuarterSymbols" : shortQuarterSymbols,
213 @"standaloneQuarterSymbols" : standaloneQuarterSymbols,
214 @"shortStandaloneQuarterSymbols" : shortStandaloneQuarterSymbols
220 _twoDigitStartDate = [[
CPDate alloc] initWithString:@"1950-01-01 00:00:00 +0000"];
226 #pragma mark Setter Getter Helper 232 var languageSymbols = [_symbols valueForKey:languageCode];
234 if (!languageSymbols)
240 return languageSymbols;
247 [_symbols setValue:symbols forKey:languageCode];
255 symbol = [languageSymbols valueForKey:aKey];
271 [languageSymbols setValue:aSymbol forKey:aKey];
275 #pragma mark Setter Getter 307 - (CPArray)weekdaySymbols
314 - (void)setWeekdaySymbols:(CPArray)aValue
321 - (CPArray)shortWeekdaySymbols
328 - (void)setShortWeekdaySymbols:(CPArray)aValue
335 - (CPArray)veryShortWeekdaySymbols
342 - (void)setVeryShortWeekdaySymbols:(CPArray)aValue
349 - (CPArray)standaloneWeekdaySymbols
356 - (void)setStandaloneWeekdaySymbols:(CPArray)aValue
363 - (CPArray)shortStandaloneWeekdaySymbols
365 return [
self symbolForKey:@"shortStandaloneWeekdaySymbols"
languageCode:[_locale objectForKey:CPLocaleLanguageCode]];
370 - (void)setShortStandaloneWeekdaySymbols:(CPArray)aValue
377 - (CPArray)veryShortStandaloneWeekdaySymbols
379 return [
self symbolForKey:@"veryShortStandaloneWeekdaySymbols"
languageCode:[_locale objectForKey:CPLocaleLanguageCode]];
384 - (void)setVeryShortStandaloneWeekdaySymbols:(CPArray)aValue
391 - (CPArray)monthSymbols
398 - (void)setMonthSymbols:(CPArray)aValue
405 - (CPArray)shortMonthSymbols
412 - (void)setShortMonthSymbols:(CPArray)aValue
419 - (CPArray)veryShortMonthSymbols
426 - (void)setVeryShortMonthSymbols:(CPArray)aValue
433 - (CPArray)standaloneMonthSymbols
440 - (void)setStandaloneMonthSymbols:(CPArray)aValue
447 - (CPArray)shortStandaloneMonthSymbols
454 - (void)setShortStandaloneMonthSymbols:(CPArray)aValue
461 - (CPArray)veryShortStandaloneMonthSymbols
463 return [
self symbolForKey:@"veryShortStandaloneMonthSymbols"
languageCode:[_locale objectForKey:CPLocaleLanguageCode]];
468 - (void)setVeryShortStandaloneMonthSymbols:(CPArray)aValue
475 - (CPArray)quarterSymbols
482 - (void)setQuarterSymbols:(CPArray)aValue
489 - (CPArray)shortQuarterSymbols
496 - (void)setShortQuarterSymbols:(CPArray)aValue
503 - (CPArray)standaloneQuarterSymbols
510 - (void)setStandaloneQuarterSymbols:(CPArray)aValue
517 - (CPArray)shortStandaloneQuarterSymbols
519 return [
self symbolForKey:@"shortStandaloneQuarterSymbols"
languageCode:[_locale objectForKey:CPLocaleLanguageCode]];
524 - (void)setShortStandaloneQuarterSymbols:(CPArray)aValue
531 #pragma mark StringFromDate methods 547 aDate = [aDate
copy];
548 [aDate _dateWithTimeZone:_timeZone];
551 return [
self _stringFromDate:aDate format:_dateFormat];
560 if ([
self _isAmericanFormat])
565 format =
@"dd.MM.yy";
567 format =
@"dd/MM/yy";
574 if ([
self _isAmericanFormat])
575 format =
@"MMM d, Y";
582 if ([
self _isAmericanFormat])
583 format =
@"MMMM d, Y";
585 format =
@"d MMMM Y";
590 if ([
self _isAmericanFormat])
591 format =
@"EEEE, MMMM d, Y";
593 format =
@"EEEE d MMMM Y";
602 if ([
self doesRelativeDateFormatting])
604 var language = [_locale objectForKey:CPLocaleLanguageCode],
605 relativeWords = [relativeDateFormating valueForKey:language];
607 for (var i = 1; i < [relativeWords count]; i = i + 2)
610 [date _dateWithTimeZone:_timeZone];
616 date.setDate([relativeWords objectAtIndex:i] + date.getDate());
618 if (date.getDate() == aDate.getDate() && date.getMonth() == aDate.getMonth() && date.getFullYear() == aDate.getFullYear())
620 relativeWord = [relativeWords objectAtIndex:(i - 1)];
637 if ([
self _isEnglishFormat])
645 if ([
self _isEnglishFormat])
646 format +=
@"h:mm:ss a";
648 format +=
@"H:mm:ss";
653 if ([
self _isEnglishFormat])
654 format +=
@"h:mm:ss a z";
656 format +=
@"H:mm:ss z";
661 if ([
self _isEnglishFormat])
662 format +=
@"h:mm:ss a zzzz";
664 format +=
@"h:mm:ss zzzz";
672 result = [
self _stringFromDate:aDate format:format];
675 result = relativeWord + result;
687 if ([anObject isKindOfClass:[
CPDate class]])
698 - (
CPString)editingStringForObjectValue:(
id)anObject
710 var length = [aFormat
length],
715 for (var i = 0; i < length; i++)
721 if ([character isEqualToString:
@"'"])
724 result += currentToken;
729 currentToken += character;
735 if ([character isEqualToString:
@"'"])
740 result += currentToken;
747 if ([[
CPDateFormatter _separatorsCharacterSet] characterIsMember:character])
749 result += [self _stringFromToken:currentToken date:aDate];
755 if ([currentToken length] && ![[currentToken characterAtIndex:0] isEqualToString:character])
757 result += [self _stringFromToken:currentToken date:aDate];
761 currentToken += character;
763 if (i == (length - 1))
764 result += [self _stringFromToken:currentToken date:aDate];
778 if (![aToken length])
783 timeZone = _timeZone;
789 CPLog.warn(
@"Token not yet implemented " + aToken);
795 return [
self _stringValueForValue:aDate.getFullYear() length:(length == 2)?length:currentLength];
800 return [
self _stringValueForValue:aDate.getFullYear() length:(length == 2)?length:currentLength];
804 CPLog.warn(
@"Token not yet implemented " + aToken);
809 CPLog.warn(
@"Token not yet implemented " + aToken);
815 if (aDate.getMonth() < 6 && aDate.getMonth() > 2)
818 if (aDate.getMonth() > 5 && aDate.getMonth() < 9)
821 if (aDate.getMonth() >= 9)
825 return [
self _stringValueForValue:quarter length:MIN(2,length)];
828 return [[
self shortQuarterSymbols] objectAtIndex:(quarter - 1)];
831 return [[
self quarterSymbols] objectAtIndex:(quarter - 1)];
836 if (aDate.getMonth() < 6 && aDate.getMonth() > 2)
839 if (aDate.getMonth() > 5 && aDate.getMonth() < 9)
842 if (aDate.getMonth() >= 9)
846 return [
self _stringValueForValue:quarter length:MIN(2,length)];
849 return [[
self shortStandaloneQuarterSymbols] objectAtIndex:(quarter - 1)];
852 return [[
self standaloneQuarterSymbols] objectAtIndex:(quarter - 1)];
858 return [
self _stringValueForValue:(aDate.getMonth() + 1) length:MAX(currentLength,length)];
861 return [[
self shortMonthSymbols] objectAtIndex:aDate.getMonth()];
864 return [[
self monthSymbols] objectAtIndex:aDate.getMonth()];
867 return [[
self veryShortMonthSymbols] objectAtIndex:aDate.getMonth()];
873 return [
self _stringValueForValue:(aDate.getMonth() + 1) length:MAX(currentLength,length)];
876 return [[
self shortStandaloneMonthSymbols] objectAtIndex:aDate.getMonth()];
879 return [[
self standaloneMonthSymbols] objectAtIndex:aDate.getMonth()];
882 return [[
self veryShortStandaloneMonthSymbols] objectAtIndex:aDate.getMonth()];
886 CPLog.warn(
@"Depreacted - Token not yet implemented " + aToken);
890 var d = [aDate
copy];
893 d.setDate(d.getDate() + 4 - (d.getDay() || 7));
895 var yearStart =
new Date(d.getFullYear(), 0, 1),
896 weekOfYear = Math.ceil((((d - yearStart) / 86400000) + 1) / 7);
898 return [
self _stringValueForValue:(weekOfYear + 1) length:MAX(2, length)];
901 var firstDay =
new Date(aDate.getFullYear(), aDate.getMonth(), 1).getDay(),
902 weekOfMonth = Math.ceil((aDate.getDate() + firstDay) / 7);
904 return [
self _stringValueForValue:weekOfMonth length:1];
909 return [
self _stringValueForValue:aDate.getDate() length:MAX(length, currentLength)];
912 var oneJan =
new Date(aDate.getFullYear(), 0, 1),
913 dayOfYear = Math.ceil((aDate - oneJan) / 86400000),
916 return [
self _stringValueForValue:dayOfYear length:MAX(currentLength, MIN(3, length))];
920 day = aDate.getDate();
922 if (day > 7 && day < 15)
925 if (day > 14 && day < 22)
928 if (day > 21 && day < 29)
934 return [
self _stringValueForValue:dayOfWeek length:1];
937 CPLog.warn(
@"Token not yet implemented " + aToken);
941 var day = aDate.getDay();
944 return [[
self shortWeekdaySymbols] objectAtIndex:day];
947 return [[
self weekdaySymbols] objectAtIndex:day];
950 return [[
self veryShortWeekdaySymbols] objectAtIndex:day];
953 var day = aDate.getDay();
956 return [
self _stringValueForValue:(day + 1) length:MIN(2, length)];
959 return [[
self shortWeekdaySymbols] objectAtIndex:day];
962 return [[
self weekdaySymbols] objectAtIndex:day];
965 return [[
self veryShortWeekdaySymbols] objectAtIndex:day];
968 var day = aDate.getDay();
971 return [
self _stringValueForValue:(day + 1) length:aDate.getDay().toString().length];
974 return [[
self shortStandaloneWeekdaySymbols] objectAtIndex:day];
977 return [[
self standaloneWeekdaySymbols] objectAtIndex:day];
980 return [[
self veryShortStandaloneWeekdaySymbols] objectAtIndex:day];
984 if (aDate.getHours() > 11)
985 return [
self PMSymbol];
987 return [
self AMSymbol];
990 var hours = aDate.getHours();
992 if ([
self _isAmericanFormat] || [
self _isEnglishFormat])
1002 return [
self _stringValueForValue:hours length:MAX(currentLength, MIN(2, length))];
1007 return [
self _stringValueForValue:aDate.getHours() length:MAX(currentLength, MIN(2, length))];
1010 var hours = aDate.getHours();
1017 return [
self _stringValueForValue:hours length:MAX(currentLength, MIN(2, length))];
1020 var hours = aDate.getHours();
1022 if (aDate.getHours() == 0)
1027 return [
self _stringValueForValue:hours length:MAX(currentLength, MIN(2, length))];
1030 CPLog.warn(
@"Token not yet implemented " + aToken);
1036 return [
self _stringValueForValue:aDate.getMinutes() length:MAX(currentLength, MIN(2, length))];
1041 return [
self _stringValueForValue:aDate.getSeconds() length:MIN(2, length)];
1044 return [
self _stringValueForValue:aDate.getMilliseconds() length:length];
1047 var value = aDate.getHours() * 60 * 60 * 1000 + aDate.getMinutes() * 60 * 1000 + aDate.getSeconds() * 1000 + aDate.getMilliseconds();
1049 return [
self _stringValueForValue:value length:value.toString().length];
1053 return [timeZone localizedName:CPTimeZoneNameStyleShortDaylightSaving locale:_locale];
1055 return [timeZone localizedName:CPTimeZoneNameStyleDaylightSaving locale:_locale];
1058 var seconds = [timeZone secondsFromGMT],
1059 minutes = seconds / 60,
1060 hours = minutes / 60,
1062 diffMinutes = (hours - parseInt(hours)) * 100 * 60 / 100;
1066 result = diffMinutes.toString();
1068 while ([result length] < 2)
1069 result =
@"0" + result;
1071 result = ABS(parseInt(hours)) + result;
1073 while ([result length] < 4)
1074 result =
@"0" + result;
1077 result =
@"+" + result;
1079 result =
@"-" + result;
1083 else if (length == 4)
1085 result = diffMinutes.toString();
1087 while ([result length] < 2)
1088 result =
@"0" + result;
1090 result =
@":" + result;
1091 result = ABS(parseInt(hours)) + result;
1093 while ([result length] < 5)
1094 result =
@"0" + result;
1097 result =
@"+" + result;
1099 result =
@"-" + result;
1101 return @"GMT" + result;
1105 result = diffMinutes.toString();
1107 while ([result length] < 2)
1108 result =
@"0" + result;
1110 result =
@":" + result;
1111 result = ABS(parseInt(hours)) + result;
1113 while ([result length] < 5)
1114 result =
@"0" + result;
1117 result =
@"+" + result;
1119 result =
@"-" + result;
1126 return [timeZone localizedName:CPTimeZoneNameStyleShortGeneric locale:_locale];
1127 else if (length == 4)
1128 return [timeZone localizedName:CPTimeZoneNameStyleGeneric locale:_locale];
1135 return [timeZone localizedName:CPTimeZoneNameStyleShortDaylightSaving locale:_locale];
1137 else if (length == 4)
1139 CPLog.warn(
@"No pattern found for " + aToken);
1146 CPLog.warn(
@"No pattern found for " + aToken);
1155 #pragma mark datefromString 1166 if (_dateFormat != nil)
1167 return [
self _dateFromString:aString format:_dateFormat];
1176 if ([
self _isAmericanFormat])
1179 format =
@"dd/MM/yy";
1184 if ([
self _isAmericanFormat])
1185 format =
@"MMM d, Y";
1187 format =
@"d MMM Y";
1192 if ([
self _isAmericanFormat])
1193 format =
@"MMMM d, Y";
1195 format =
@"d MMMM Y";
1200 if ([
self _isAmericanFormat])
1201 format =
@"EEEE, MMMM d, Y";
1203 format =
@"EEEE d MMMM Y";
1218 if ([
self _isEnglishFormat])
1219 format +=
@" h:mm a";
1225 if ([
self _isEnglishFormat])
1226 format +=
@" h:mm:ss a";
1228 format +=
@" H:mm:ss";
1232 if ([
self _isEnglishFormat])
1233 format +=
@" h:mm:ss a z";
1235 format +=
@" H:mm:ss z";
1239 if ([
self _isEnglishFormat])
1240 format +=
@" h:mm:ss a zzzz";
1242 format +=
@" h:mm:ss zzzz";
1249 return [
self _dateFromString:aString format:format];
1258 - (BOOL)getObjectValue:(idRef)anObject forString:(
CPString)aString errorDescription:(CPStringRef)anError
1261 @deref(anObject) = value;
1266 @deref(anError) =
@"The value \"" + aString + "\
" is invalid.";
1290 tokens = [CPArray array],
1291 dateComponents = [CPArray array],
1292 patternTokens = [CPArray array];
1294 for (var i = 0; i < [aFormat
length]; i++)
1300 if ([character isEqualToString:
@"'"])
1306 if ([character isEqualToString:
@"'"])
1314 if ([character isEqualToString:
@","] || [character isEqualToString:
@":"] || [character isEqualToString:
@"/"] || [character isEqualToString:
@"-"] || [character isEqualToString:
@" "])
1316 [tokens addObject:currentToken];
1319 [patternTokens addObject:[tokens count] - 1];
1325 if ([currentToken length] && ![[currentToken characterAtIndex:0] isEqualToString:character])
1327 [tokens addObject:currentToken];
1330 [patternTokens addObject:[tokens count] - 1];
1335 currentToken += character;
1337 if (i == ([aFormat length] - 1))
1339 [tokens addObject:currentToken];
1342 [patternTokens addObject:[tokens count] - 1];
1350 var currentIndexSpecialPattern = 0;
1352 if ([patternTokens count] == 0)
1355 for (var i = 0; i < [aString
length]; i++)
1361 if ([character isEqualToString:
@"'"])
1367 if ([character isEqualToString:
@"'"])
1376 if ([dateComponents count] == [patternTokens objectAtIndex:currentIndexSpecialPattern])
1378 var j = [
self _lastIndexMatchedString:aString token:[tokens objectAtIndex:[dateComponents count]] index:i];
1383 currentIndexSpecialPattern++;
1390 if ([character isEqualToString:
@","] || [character isEqualToString:
@":"] || [character isEqualToString:
@"/"] || [character isEqualToString:
@"-"] || [character isEqualToString:
@" "])
1392 [dateComponents addObject:currentToken];
1397 currentToken += character;
1399 if (i == ([aString length] - 1))
1400 [dateComponents addObject:currentToken];
1404 if ([dateComponents count] != [tokens count])
1407 return [
self _dateFromTokens:tokens dateComponents:dateComponents];
1410 - (
CPDate)_dateFromTokens:(CPArray)tokens dateComponents:(CPArray)dateComponents
1412 var timeZoneseconds = [_timeZone secondsFromGMT],
1413 dateArray = [2000, 01, 01, 00, 00, 00, @"+0000"],
1420 for (var i = 0; i < [tokens count]; i++)
1422 var token = [tokens objectAtIndex:i],
1423 dateComponent = [dateComponents objectAtIndex:i],
1424 character = [token characterAtIndex:0],
1425 length = [token length];
1431 CPLog.warn(
@"Token not yet implemented " + token);
1435 var u = _twoDigitStartDate.getFullYear() % 10,
1436 d = parseInt(_twoDigitStartDate.getFullYear() / 10) % 10,
1437 c = parseInt(_twoDigitStartDate.getFullYear() / 100) % 10,
1438 m = parseInt(_twoDigitStartDate.getFullYear() / 1000) % 10;
1440 if (length == 2 && dateComponent.length == 2)
1442 if ((u + d * 10) >= parseInt(dateComponent))
1443 dateArray[0] = (c + 1) * 100 + m * 1000 + parseInt(dateComponent);
1445 dateArray[0] = c * 100 + m * 1000 + parseInt(dateComponent);
1449 dateArray[0] = parseInt(dateComponent);
1455 var u = _twoDigitStartDate.getFullYear() % 10,
1456 d = parseInt(_twoDigitStartDate.getFullYear() / 10) % 10,
1457 c = parseInt(_twoDigitStartDate.getFullYear() / 100) % 10,
1458 m = parseInt(_twoDigitStartDate.getFullYear() / 1000) % 10;
1460 if (length == 2 && dateComponent.length == 2)
1462 if ((u + d * 10) >= parseInt(dateComponent))
1463 dateArray[0] = (c + 1) * 100 + m * 1000 + parseInt(dateComponent);
1465 dateArray[0] = c * 100 + m * 1000 + parseInt(dateComponent);
1469 dateArray[0] = parseInt(dateComponent);
1476 CPLog.warn(
@"Token not yet implemented " + token);
1481 CPLog.warn(
@"Token not yet implemented " + token);
1488 month = (parseInt(dateComponent) - 1) * 3;
1492 if (![[
self shortQuarterSymbols] containsObject:dateComponent])
1495 month = [[
self shortQuarterSymbols] indexOfObject:dateComponent] * 3;
1500 if (![[
self quarterSymbols] containsObject:dateComponent])
1503 month = [[
self quarterSymbols] indexOfObject:dateComponent] * 3;
1509 dateArray[1] = month + 1;
1516 month = (parseInt(dateComponent) - 1) * 3;
1520 if (![[
self shortQuarterSymbols] containsObject:dateComponent])
1523 month = [[
self shortQuarterSymbols] indexOfObject:dateComponent] * 3;
1528 if (![[
self quarterSymbols] containsObject:dateComponent])
1531 month = [[
self quarterSymbols] indexOfObject:dateComponent] * 3;
1537 dateArray[1] = month + 1;
1544 month = parseInt(dateComponent);
1548 if (![[
self shortMonthSymbols] containsObject:dateComponent])
1551 month = [[
self shortMonthSymbols] indexOfObject:dateComponent] + 1;
1556 if (![[
self monthSymbols] containsObject:dateComponent])
1559 month = [[
self monthSymbols] indexOfObject:dateComponent] + 1;
1562 if (month > 12 || length >= 5)
1565 dateArray[1] = month;
1572 month = parseInt(dateComponent);
1576 if (![[
self shortStandaloneMonthSymbols] containsObject:dateComponent])
1579 month = [[
self shortStandaloneMonthSymbols] indexOfObject:dateComponent] + 1;
1584 if (![[
self standaloneMonthSymbols] containsObject:dateComponent])
1587 month = [[
self standaloneMonthSymbols] indexOfObject:dateComponent] + 1;
1590 if (month > 12 || length >= 5)
1593 dateArray[1] = month;
1598 CPLog.warn(
@"Depreacted - Token not yet implemented " + token);
1602 if (dateComponent > 52)
1605 weekOfYear = dateComponent;
1609 if (dateComponent > 52)
1612 weekOfMonth = dateComponent;
1616 dateArray[2] = parseInt(dateComponent);
1620 if (isNaN(parseInt(dateComponent)) || parseInt(dateComponent) > 345)
1623 dayOfYear = parseInt(dateComponent);
1627 if (isNaN(parseInt(dateComponent)) || parseInt(dateComponent) > 5 || parseInt(dateComponent) == 0)
1630 if (parseInt(dateComponent) == 1)
1633 if (parseInt(dateComponent) == 2)
1636 if (parseInt(dateComponent) == 3)
1639 if (parseInt(dateComponent) == 4)
1642 if (parseInt(dateComponent) == 5)
1648 CPLog.warn(
@"Token not yet implemented " + token);
1653 dayIndexInWeek = [[
self shortWeekdaySymbols] indexOfObject:dateComponent];
1656 dayIndexInWeek = [[
self weekdaySymbols] indexOfObject:dateComponent];
1658 if (dayIndexInWeek ==
CPNotFound || length >= 5)
1664 if (length <= 2 && isNaN(parseInt(dateComponent)))
1668 dayIndexInWeek = parseInt(dateComponent);
1671 dayIndexInWeek = [[
self shortWeekdaySymbols] indexOfObject:dateComponent];
1674 dayIndexInWeek = [[
self weekdaySymbols] indexOfObject:dateComponent];
1676 if (dayIndexInWeek ==
CPNotFound || length >= 5)
1682 if (length <= 2 && isNaN(parseInt(dateComponent)))
1686 dayIndexInWeek = dateComponent;
1689 dayIndexInWeek = [[
self shortStandaloneWeekdaySymbols] indexOfObject:dateComponent];
1692 dayIndexInWeek = [[
self standaloneWeekdaySymbols] indexOfObject:dateComponent];
1695 dayIndexInWeek = [[
self veryShortStandaloneWeekdaySymbols] indexOfObject:dateComponent];
1697 if (dayIndexInWeek ==
CPNotFound || length >= 5)
1703 if (![dateComponent isEqualToString:[
self PMSymbol]] && ![dateComponent isEqualToString:[
self AMSymbol]])
1706 if ([dateComponent isEqualToString:[
self PMSymbol]])
1712 if (parseInt(dateComponent) < 0 || parseInt(dateComponent) > 12)
1715 dateArray[3] = parseInt(dateComponent);
1719 if (parseInt(dateComponent) < 0 || parseInt(dateComponent) > 23)
1722 dateArray[3] = parseInt(dateComponent);
1726 if (parseInt(dateComponent) < 0 || parseInt(dateComponent) > 11)
1729 dateArray[3] = parseInt(dateComponent);
1733 if (parseInt(dateComponent) < 0 || parseInt(dateComponent) > 12)
1736 dateArray[3] = parseInt(dateComponent);
1740 CPLog.warn(
@"Token not yet implemented " + token);
1744 var minutes = parseInt(dateComponent);
1749 dateArray[4] = minutes;
1753 var seconds = parseInt(dateComponent);
1758 dateArray[5] = seconds;
1762 if (isNaN(parseInt(dateComponent)))
1768 if (isNaN(parseInt(dateComponent)))
1771 var millisecondsInDay = parseInt(dateComponent),
1772 tmpDate =
new Date();
1774 tmpDate.setHours(0);
1775 tmpDate.setMinutes(0);
1776 tmpDate.setSeconds(0);
1777 tmpDate.setMilliseconds(0);
1779 tmpDate.setMilliseconds(millisecondsInDay);
1781 dateArray[3] = tmpDate.getHours();
1782 dateArray[4] = tmpDate.getMinutes();
1783 dateArray[5] = tmpDate.getSeconds();
1788 timeZoneseconds = [
self _secondsFromTimeZoneString:dateComponent style:CPTimeZoneNameStyleShortDaylightSaving];
1790 timeZoneseconds = [
self _secondsFromTimeZoneString:dateComponent style:CPTimeZoneNameStyleDaylightSaving];
1792 if (!timeZoneseconds)
1793 timeZoneseconds = [
self _secondsFromTimeZoneDefaultFormatString:dateComponent];
1795 if (!timeZoneseconds)
1798 timeZoneseconds = timeZoneseconds + 60 * 60;
1803 timeZoneseconds = [
self _secondsFromTimeZoneDefaultFormatString:dateComponent];
1805 if (!timeZoneseconds)
1808 timeZoneseconds = timeZoneseconds + 60 * 60;
1814 timeZoneseconds = [
self _secondsFromTimeZoneString:dateComponent style:CPTimeZoneNameStyleShortGeneric];
1816 timeZoneseconds = [
self _secondsFromTimeZoneString:dateComponent style:CPTimeZoneNameStyleGeneric];
1818 if (!timeZoneseconds && length == 4)
1819 timeZoneseconds = [
self _secondsFromTimeZoneDefaultFormatString:dateComponent];
1821 if (!timeZoneseconds)
1824 timeZoneseconds = timeZoneseconds + 60 * 60;
1830 timeZoneseconds = [
self _secondsFromTimeZoneString:dateComponent style:CPTimeZoneNameStyleShortStandard];
1832 timeZoneseconds = [
self _secondsFromTimeZoneString:dateComponent style:CPTimeZoneNameStyleStandard];
1834 if (!timeZoneseconds)
1835 timeZoneseconds = [
self _secondsFromTimeZoneDefaultFormatString:dateComponent];
1837 if (!timeZoneseconds)
1840 timeZoneseconds = timeZoneseconds + 60 * 60;
1845 CPLog.warn(
@"No pattern found for " + token);
1853 var tmpDate =
new Date();
1854 tmpDate.setFullYear(dateArray[0]);
1855 tmpDate.setMonth(0);
1857 tmpDate.setDate(dayOfYear);
1859 dateArray[1] = tmpDate.getMonth() + 1;
1860 dateArray[2] = tmpDate.getDate();
1864 dateArray[2] = (weekOfMonth - 1) * 7 + 1;
1868 var tmpDate =
new Date();
1869 tmpDate.setFullYear(dateArray[0]);
1870 tmpDate.setMonth(0);
1873 while (tmpDate.getDay() != 0)
1874 tmpDate.setDate(tmpDate.getDate() + 1);
1876 tmpDate.setDate(tmpDate.getDate() + (weekOfYear - 1) * 7);
1878 dateArray[1] = tmpDate.getMonth() + 1;
1879 dateArray[2] = tmpDate.getDate() - 1;
1883 var tmpDate =
new Date();
1884 tmpDate.setMonth(dateArray[1] - 1);
1885 tmpDate.setFullYear(dateArray[0]);
1887 if (dateArray[2] <= 0 || dateArray[2] > [tmpDate _daysInMonth])
1894 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])))
1897 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]]];
1898 dateResult.setSeconds(dateResult.getSeconds() - timeZoneseconds + 60 * 60);
1907 - (
CPString)_stringValueForValue:(
id)aValue length:(
int)length
1911 if ([
string length] == length)
1914 if ([
string length] > length)
1915 return [string substringFromIndex:([string length] - length)];
1917 while ([
string length] < length)
1925 - (BOOL)_isAmericanFormat
1927 return [[_locale objectForKey:CPLocaleCountryCode] isEqualToString:@"US"];
1932 - (BOOL)_isEnglishFormat
1934 return [[_locale objectForKey:CPLocaleLanguageCode] isEqualToString:@"en"];
1939 - (int)_secondsFromTimeZoneDefaultFormatString:(
CPString)aTimeZoneFormatString
1941 var format =
new RegExp(
"\\w*([HPG-GMT])?([+-])(\\d{1,2})([:])?(\\d{2})\\w*"),
1942 result = aTimeZoneFormatString.match(
new RegExp(format)),
1948 seconds = result[3] * 60 * 60 + result[5] * 60;
1950 if ([result[2] isEqualToString:
@"-"])
1958 - (int)_secondsFromTimeZoneString:(
CPString)aTimeZoneString style:(NSTimeZoneNameStyle)aStyle
1960 var timeZone = [
CPTimeZone _timeZoneFromString:aTimeZoneString style:aStyle locale:_locale];
1965 return [timeZone secondsFromGMT];
1974 - (int)_lastIndexMatchedString:(
CPString)aString token:(
CPString)aToken index:anIndex
1977 length = [aToken
length],
1979 format =
new RegExp(
"\\w*([HPG-GMT])?([+-])(\\d{1,2})([:])?(\\d{2})\\w*"),
1980 result = aString.match(
new RegExp(format));
1986 targetedArray = [
self shortQuarterSymbols];
1989 targetedArray = [
self quarterSymbols];
1995 targetedArray = [
self shortStandaloneQuarterSymbols];
1998 targetedArray = [
self standaloneQuarterSymbols];
2004 targetedArray = [
self shortMonthSymbols];
2007 targetedArray = [
self monthSymbols];
2010 targetedArray = [
self veryShortMonthSymbols];
2016 targetedArray = [
self shortStandaloneMonthSymbols];
2019 targetedArray = [
self standaloneMonthSymbols];
2022 targetedArray = [
self veryShortStandaloneMonthSymbols];
2028 targetedArray = [
self shortWeekdaySymbols];
2031 targetedArray = [
self weekdaySymbols];
2034 targetedArray = [
self veryShortWeekdaySymbols];
2040 targetedArray = [
self shortWeekdaySymbols];
2043 targetedArray = [
self weekdaySymbols];
2046 targetedArray = [
self veryShortWeekdaySymbols];
2052 targetedArray = [
self shortStandaloneWeekdaySymbols];
2055 targetedArray = [
self standaloneWeekdaySymbols];
2058 targetedArray = [
self veryShortStandaloneWeekdaySymbols];
2063 targetedArray = [[
self PMSymbol], [
self AMSymbol]];
2068 targetedArray = [
CPTimeZone _namesForStyle:CPTimeZoneNameStyleShortDaylightSaving locale:_locale];
2070 targetedArray = [
CPTimeZone _namesForStyle:CPTimeZoneNameStyleDaylightSaving locale:_locale];
2073 return anIndex + [result objectAtIndex:0].length;
2079 return anIndex + [result objectAtIndex:0].length;
2085 targetedArray = [
CPTimeZone _namesForStyle:CPTimeZoneNameStyleShortGeneric locale:_locale];
2086 else if (length == 4)
2087 targetedArray = [
CPTimeZone _namesForStyle:CPTimeZoneNameStyleGeneric locale:_locale];
2090 return anIndex + [result objectAtIndex:0].length;
2096 targetedArray = [
CPTimeZone _namesForStyle:CPTimeZoneNameStyleShortStandard locale:_locale];
2099 return anIndex + [result objectAtIndex:0].length;
2104 CPLog.warn(
@"No pattern found for " + aToken);
2108 for (var i = 0; i < [targetedArray count]; i++)
2110 var currentObject = [targetedArray objectAtIndex:i],
2113 if (range.length == 0)
2116 character = [aString characterAtIndex:(anIndex + range.length)];
2118 if ([character isEqualToString:
@"'"] || [character isEqualToString:
@","] || [character isEqualToString:
@":"] || [character isEqualToString:
@"/"] || [character isEqualToString:
@"-"] || [character isEqualToString:
@" "] || [character isEqualToString:
@""])
2119 return anIndex + range.length;
2143 _allowNaturalLanguage = [aCoder decodeBoolForKey:CPDateFormatterAllowNaturalLanguageKey];
2144 _dateFormat = [aCoder decodeObjectForKey:CPDateFormatterDateFormatKey];
2145 _dateStyle = [aCoder decodeIntForKey:CPDateFormatterDateStyleKey];
2146 _doesRelativeDateFormatting = [aCoder decodeBoolForKey:CPDateFormatterDoseRelativeDateFormattingKey];
2147 _formatterBehavior = [aCoder decodeIntForKey:CPDateFormatterFormatterBehaviorKey];
2148 _locale = [aCoder decodeObjectForKey:CPDateFormatterLocaleKey];
2149 _timeStyle = [aCoder decodeIntForKey:CPDateFormatterTimeStyleKey];
2161 [aCoder encodeBool:_allowNaturalLanguage forKey:CPDateFormatterAllowNaturalLanguageKey];
2162 [aCoder encodeInt:_dateStyle forKey:CPDateFormatterDateStyleKey];
2163 [aCoder encodeObject:_dateFormat forKey:CPDateFormatterDateFormatKey];
2164 [aCoder encodeBool:_doesRelativeDateFormatting forKey:CPDateFormatterDoseRelativeDateFormattingKey];
2165 [aCoder encodeInt:_formatterBehavior forKey:CPDateFormatterFormatterBehaviorKey];
2166 [aCoder encodeInt:_locale forKey:CPDateFormatterLocaleKey];
2167 [aCoder encodeInt:_timeStyle forKey:CPDateFormatterTimeStyleKey];
2177 - (void)_dateWithTimeZone:(
CPTimeZone)aTimeZone
2182 self.setSeconds(
self.getSeconds() - [aTimeZone secondsFromGMTForDate:
self]);
2183 self.setSeconds(
self.getSeconds() + [aTimeZone secondsFromGMT]);
2193 - (BOOL)allowNaturalLanguage
2195 return _allowNaturalLanguage;
2201 - (BOOL)doesRelativeDateFormatting
2203 return _doesRelativeDateFormatting;
2209 - (void)setDoesRelativeDateFormatting:(BOOL)aValue
2211 _doesRelativeDateFormatting = aValue;
2219 return _defaultDate;
2227 _defaultDate = aValue;
2235 return _twoDigitStartDate;
2243 _twoDigitStartDate = aValue;
2249 - (CPDateFormatterBehavior)formatterBehavior
2251 return _formatterBehavior;
2257 - (void)setFormatterBehavior:(CPDateFormatterBehavior)aValue
2259 _formatterBehavior = aValue;
2265 - (CPDateFormatterStyle)dateStyle
2273 - (void)setDateStyle:(CPDateFormatterStyle)aValue
2275 _dateStyle = aValue;
2281 - (CPDateFormatterStyle)timeStyle
2289 - (void)setTimeStyle:(CPDateFormatterStyle)aValue
2291 _timeStyle = aValue;
2339 _dateFormat = aValue;
A representation of a single point in time.
CPString substringWithRange:(CPRange aRange)
A mutable key-value pair collection.
id characterSetWithCharactersInString:(CPString aString)
An immutable string (collection of characters).
CPTimeZone systemTimeZone()
if(CPFeatureIsCompatible(CPHTMLCanvasFeature))
CPTimeZone is a class to define the behvior of time zone object (like CPDatePicker) ...
id initWithTimeIntervalSinceReferenceDate:(CPTimeInterval seconds)
Defines methods for use when archiving & restoring (enc/decoding).
CPString characterAtIndex:(CPUInteger anIndex)
CPRange rangeOfString:(CPString aString)
id stringWithFormat:(CPString format, [,] ...)