2015-09-30 124 views

回答

2

可以使用正則表達式來檢查它。 例如該代碼使用正則表達式來檢查「MM.DD.YYYY」:

NSError *error = NULL; 
NSString *expForreg = @"^((((0[13578])|([13578])|(1[02]))[\\.](([1-9])|([0-2][0-9])|(3[01])))|(((0[469])|([469])|(11))[\\.](([1-9])|([0-2][0-9])|(30)))|((2|02)[\\.](([1-9])|([0-2][0-9]))))[\\.]\\d{4}$|^\\d{4}$"; 
NSRegularExpression *regex = [NSRegularExpression 
           regularExpressionWithPattern:expForreg 
           options:NSRegularExpressionCaseInsensitive 
           error:&error]; 
NSArray *matches = [regex matchesInString:@"10.30.1989" options:0 range:NSMakeRange(0, [@"10.30.1989" length])]; 
if(matches && matches.count > 0) 
{ 
    NSLog(@"Ok"); 
}else 
{ 
    NSLog(@"No"); 
} 

希望這有助於!

+0

爲什麼不使用'NSDateFormatter'?這個正則表達式很瘋狂。它處理閏年嗎? – rmaddy

+0

@rmaddy:在這種情況下(只有「mm.dd.yyyy」),我認爲NSDateFormatter是正確的選擇。但是,如果你想允許檢查「mm/dd/mmmm」,「mm-dd-yyyy」,...嘗試使用正則表達式。 – Franken

+0

咦?無論日期格式如何,「NSDateFormatter」都是正確的選擇。這是它的目的。 – rmaddy

3

您可以使用這樣的代碼:

NSString *dateString = @"01.01.1970"; 
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
dateFormatter.dateFormat = @"dd.MM.yyyy"; 
if ([dateFormatter dateFromString:dateString]) { 
    //YES 
} 

爲什麼NSDateFormatter:它的成立是爲了解析日期。此外,通過這種方式,您可以輕鬆地更改日期格式並作爲副作用,獲取可以使用的有效的NSDate對象。

但是,如果您打算經常使用此dateFormatter(例如,它在UITableViewCell內部使用),則可能會遇到性能問題。如果你這樣做了,並且你確定NSDateFormatter是什麼導致它(儀器可能會幫助你),你可以重複使用你的dateFormatter。例如,像這樣:

NSString *dateString = @"01.01.1970"; 
static NSDateFormatter *dateFormatter = nil; 
static dispatch_once_t onceToken; 
dispatch_once(&onceToken, ^{ 
    dateFormatter = [[NSDateFormatter alloc] init]; 
    dateFormatter.dateFormat = @"dd.MM.yyyy"; 
}); 

if ([dateFormatter dateFromString:dateString]) { 
    //YES 
} 

看來(這是基於我跑測試我的猜測),爲dateFromString第一次調用觸發dateFormatter內延遲初始化,它需要一定的時間(幾個測試結果下面)。如果您重新使用它,NSDateFormatter初始化只執行一次。

在我與iOS iPhone 5S 8.4.1版本dispatch_once工作快約10倍:

dispatch_once:0.536秒,娛樂:5.475秒 (時間解析10.000日期)

在相同的測試@zaph了與iOS 9.x中對他的iPhone 6S 2倍的性能差異:

dispatch_once:0.92秒,遊憩:1.01秒 (時間解析10.000日期)

所以,這取決於設備,操作系統版本上和你打算如何集中使用該dateFormatter。在某些情況下,第二個代碼片段可能是過度殺傷性的。但是我遇到了能夠顯着提升性能的情況。

+0

我無法想象爲什麼有人會投票回答這個問題 – rmaddy

+0

創建' NSDateFormatter'? – zaph

+0

@zaph,它的價格非常昂貴,例如'cellForRowAtIndexPath'中不是你想要做的事情。因爲它遇到令人失望的表現)。我將在一分鐘內通過一個小演示和一個測試結果更新我的答案。 – FreeNickname

1

您可以使用正則表達式:

NSString *testString = @"11.22.3333"; 

NSString *pattern = @"^\\d{2}\\.\\d{2}\\.\\d{4}$"; 
NSRange range = [testString rangeOfString:pattern options:NSRegularExpressionSearch]; 
if (range.location != NSNotFound) { 
    NSLog(@"Ok"); 
} 
else{ 
    NSLog(@"No"); 
} 

位,是不是真的是一個好日期的考驗。