在iOS中如何将字符串转换为日期?

3

我从服务器获取到一个字符串形式的日期,它长这样"10/4/2013 10:00:00 PM"。现在我只想在我的标签中显示小时数。但问题在于,我使用了下面的代码,但实际上没有得到正确的时间。

-(NSString*)convert:(NSString*)strdate
{

    NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
    [formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
    [formatter setLocale:[NSLocale systemLocale]];
   [formatter setDateFormat:@"dd/MM/yyyy HH:mm:ss a"];
    NSDate * date = [formatter dateFromString:strdate];


    NSDateFormatter* df = [[NSDateFormatter alloc]init];
    [df setDateFormat:@"hh:mm"];
    NSString *depResult = [df stringFromDate:date];

    NSLog(@"hours  %@ ", [df stringFromDate:date]);

    return depResult;
}

我提供了一个字符串输入 "10/4/2013 9:00:00 PM",并且得到了输出结果 "05:30"。请指出我的错误之处。谢谢。


2
你在印度吧?印度的时区偏移量是多少? - Hot Licks
1
请勿使用固定日期格式,而是使用 NSDateFormatterStyle - rckoenes
2
这里应该将HH改为hh,代码如下:[formatter setDateFormat:@"dd/MM/yyyy hh:mm:ss a"]; - Anoop Vaidya
1
如果日期字符串来自“服务”,那么必须使用固定的日期格式。 - @rckoenes - Hot Licks
2
@rckoenes 您可以完全忽略格式样式。它们在某些语言环境下存在问题,且种类有限。最好从模板生成样式(+[NSDateFormatter dateFormatFromTemplate:options:locale:])。 - Sulthan
显示剩余5条评论
3个回答

11
+(NSString *)getDateStringFromDate :(NSDate *)date {
    NSDateFormatter * dateFormatter = [[NSDateFormatter alloc]init];
    [dateFormatter setDateFormat:@"dd/MM/yyyy hh:mm:ss a"];
    NSString *dateString = [dateFormatter stringFromDate:date];
    return dateString;
}

+(NSDate *)getDateFromDateString :(NSString *)dateString {
    NSDateFormatter * dateFormatter = [[NSDateFormatter alloc]init];
    [dateFormatter setDateFormat:@"dd/MM/yyyy hh:mm:ss a"];
    NSDate *date = [dateFormatter dateFromString:dateString];
    return date;
}

2
如果你从服务器获取了这个日期 "10/4/2013 9:00:00 pm",并且希望将其转换为印度时间,如果你期望的输出是02:24 AM,那么你需要像这样做。
-(NSString*)convert:(NSString*)strdate
{

    NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
    [formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
    [formatter setLocale:[NSLocale systemLocale]];
    [formatter setDateFormat:@"dd/MM/yyyy hh:mm:ss a"];
    NSDate * date = [formatter dateFromString:strdate];


    NSDateFormatter* df = [[NSDateFormatter alloc]init];
    [df setDateFormat:@"hh:mm a"];
    NSString *depResult = [df stringFromDate:date];

    NSLog(@"hours  %@ ", [df stringFromDate:date]);

    return depResult;
}

嗨@Anoop Vaidya,这不仅仅是为了印度,我想要它适用于全球,你能帮我吗?感谢你的回答。 - Sugan S
这将适用于任何国家,您的语言环境为systemlocale... 您需要将timeZoneForSec设置为0。 - Anoop Vaidya

2
使用下列代码:
- (NSString *)convert:(NSString *)strdate
{
    NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
    [formatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
    [formatter setLocale:[NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"]];
    [formatter setDateFormat:@"dd/MM/yyyy hh:mm:ss a"];
    NSDate * date = [formatter dateFromString:strdate];


    NSDateFormatter * df = [[NSDateFormatter alloc] init];
    [df setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
    [formatter setLocale:[NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"]];
    [df setDateFormat:@"hh:mm"];
    NSString * depResult = [df stringFromDate:date];

    NSLog(@"hours  %@ ", [df stringFromDate:date]);

    return depResult;
}

我猜 en_US_POSIX 不是必需的。 - Anoop Vaidya
这并不是必须的,但建议在处理固定格式日期时使用固定区域设置。en_US_POSIX 是最好的区域设置选择。 - Vytautas
系统语言环境呢? - Anoop Vaidya
在不同的机器上它是不同的。 - Vytautas
1
@AnoopVaidya - 如果你计划"硬连接"12/24小时制的设置,那么绝对需要使用en_US_POSIX。否则iOS可能不会遵守你的12/24小时格式设置。 - Hot Licks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接