即使我传递的字符串具有如下所示的日期,我也会得到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"]
代码: -
-(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);
}
输出日期: -
日期=(null)
时间=(null)
输入可以是任何格式,例如
输入
“2012年12月1日”
的输出
日期=“2012年12月1日”
时间=空
输入
“12/1/2012 01:43 am”
的输出
日期=“2012年12月1日”
时间= 01:43 am
输入 “01:43 am” 的输出 日期=空 时间=“01:43 am”
在这里可以得到不同的答案Objective-C String(yyyy-mm-dd) to NSDate。如果日期格式设置错误,则指的是答案。
在我的情况下,日期格式是正确的。但它可能只有日期,只有时间或两者兼而有之。 要将日期和时间与字符串分开,可在此处引用ios4 - splitting a date and time from a string into two separate strings,但它没有选中的答案或有效的答案。
答案 0 :(得分:5)
删除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];
}
您的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];
}
OR
-(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];
}
编辑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);
}
答案 1 :(得分:1)
您将日期格式设置为包含时间:MM/dd/yyyy hh:mm a
,但您没有随时随身携带字符串:12/1/2012
。
只需从日期格式中删除hh:mm a
:
-(void) testDate:(NSString*) str{
NSDateFormatter *formatter=[[NSDateFormatter alloc] init];
[formatter setDateFormat:@"MM/dd/yyyy"];
self.dateTest = [formatter dateFromString:str];
[self printDate:self.dateTest];
}
另外我建议不要使用静态日期格式,只要你有非美国用户。 Apple添加了NSDateFormatterStyle
,以便您使用用户/系统选择的格式化格式。
-(void) printDate:(NSDate*) date{
NSDateFormatter *dateF=[[NSDateFormatter alloc] init];
dateF.dateStyle = NSDateFormatterMediumStyle;
dateF.timeStyle = NSDateFormatterNoStyle;
NSString *dateStr=[dateF stringFromDate:date];
NSLog(@"Date= %@",dateStr);
dateF.dateStyle = NSDateFormatterNoStyle;
dateF.timeStyle = NSDateFormatterShortStyle;
NSString *timeStr=[dateF stringFromDate:date];
NSLog(@"Time= %@",timeStr);
}