NNi*_*ikN -1 objective-c nsdate nsdateformatter ios
即使我传递的字符串有如下所示的日期,我也会得到null日期: -
通用输入日期格式为"MM/dd/YYYY hh:mm a"
NSString输入日期可以是以下之一:"12/1/2012","12/1/2012 01:43 am","01:43 am"
我正在尝试的预期输出是,如果它存在于输入字符串中,它必须打印日期,如果输入字符串中存在时间,则必须打印出时间.
输入: -
[self testDate:@"12/1/2012"]
Run Code Online (Sandbox Code Playgroud)
码:-
-(void) testDate:(NSString*) str{
NSDateFormatter *formatter=[[NSDateFormatter alloc] init];
[formatter setDateFormat:@"MM/dd/yyyy hh:mm a"];//My Generic Date Format
self.dateTest=[formatter dateFromString:str];
[self printDate:self.dateTest];
}
-(void) printSeparatedDateAndTime:(NSDate*) date{
NSDateFormatter *dateF=[[NSDateFormatter alloc] init];
[dateF setDateFormat:@"MM/dd/yyyy"];
NSString *dateStr=[dateF stringFromDate:date];
NSLog(@"Date= %@",dateStr);
[dateF setDateFormat:@"hh:mm a"];
NSString *timeStr=[dateF stringFromDate:date];
NSLog(@"Time= %@",timeStr);
}
Run Code Online (Sandbox Code Playgroud)
输出日期: -
日期=(null)
时间=(null)
输入可以是任何格式,例如
输入
"12/1/2012"
输出
日期="12/1/2012"time = null
输入
"12/1/2012 01:43 am"
输出
日期="12/1/2012"时间= 01:43 am
输入
"01:43 am"
输出
日期= null time ="01:43 am"
人们可以在这里得到一个不同的答案Objective-C String(yyyy-mm-dd)到NSDate.如果日期格式设置错误,则指的是答案.
在我的情况下,日期格式是正确的.但它可能只有日期,只有时间或两者兼而有之.要将日期和时间与字符串分开,可以在此处引用ios4 - 将字符串中的日期和时间拆分为两个单独的字符串,但它没有选中的答案或有效的答案.
删除hh:mm a ,格式可以是"MM/dd/yyyy"或"dd/MM/yyyy".
-(void) testDate:(NSString*) str{
NSDateFormatter *formatter=[[NSDateFormatter alloc] init];
[formatter setDateFormat:@"dd/MM/yyyy"];
self.dateTest=[formatter dateFromString:str];
[self printDate:date];
}
Run Code Online (Sandbox Code Playgroud)
printeDate:由于创建日期没有任何关于时间的信息,并且您尝试显示小时和分钟,因此您将无法正常工作.它将始终显示12.00 AM.
如果要显示小时和分钟,则需要在输入字符串中包含该小时和分钟.
编辑:由于dateFormats可以采用三种格式,您需要进行反复试验.
-(void) testDate:(NSString*) str{
NSArray *dateFormats = @[@"dd/MM/yyyy",@"hh:mm a",@"dd/MM/yyyy hh:mm a"];
NSDateFormatter *formatter=[[NSDateFormatter alloc] init];
NSDate *date = nil;
for (NSString *dateFormat in dateFormats) {
[formatter setDateFormat:dateFormat];
date = [formatter dateFromString:str];
if (date) {
break;
}
}
[self printDate:date];
}
Run Code Online (Sandbox Code Playgroud)
要么
-(void) testDate:(NSString*) dateString
{
NSDate *date = nil;
NSError *error = nil;
NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeDate
error:&error];
NSArray *matches = [detector matchesInString:dateString
options:0
range:NSMakeRange(0, [dateString length])];
for (NSTextCheckingResult *match in matches) {
if (match.date) {
date = match.date;
break;
}
}
[self printDate:date];
}
Run Code Online (Sandbox Code Playgroud)
编辑2:因为要求数据/时间为零.请试试
typedef enum {
ValidDateType = 0,
ValidTimeType = 1,
ValidDateTimeType =2
}ValidType;
- (void)testDate:(NSString*) dateString
{
NSArray *dateFormats = @[@"dd/MM/yyyy",@"hh:mm a",@"dd/MM/yyyy hh:mm a"];
NSDateFormatter *formatter=[[NSDateFormatter alloc] init];
__block NSDate *date = nil;
__block ValidType type = ValidDateType;
[dateFormats enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSString *dateFormat = (NSString *)obj;
[formatter setDateFormat:dateFormat];
date = [formatter dateFromString:dateString];
if (date) {
type = idx;
*stop = TRUE;
}
}];
[self printDate:date validType:type];
}
- (void)printDate:(NSDate*) date validType:(ValidType)type
{
NSDateFormatter *dateF=[[NSDateFormatter alloc] init];
[dateF setDateFormat:@"MM/dd/yyyy"];
NSString *dateStr=[dateF stringFromDate:date];
[dateF setDateFormat:@"hh:mm a"];
NSString *timeStr=[dateF stringFromDate:date];
dateStr = (type == ValidTimeType)?nil:dateStr;
timeStr = (type == ValidDateType)?nil:timeStr;
NSLog(@"Time= %@",timeStr);
NSLog(@"Date= %@",dateStr);
}
Run Code Online (Sandbox Code Playgroud)