iOS:日期转换导致日期错误

Posted

技术标签:

【中文标题】iOS:日期转换导致日期错误【英文标题】:iOS : Date conversion results in wrong date 【发布时间】:2013-08-09 13:49:45 【问题描述】:

我以前用几种格式做过几次。无法理解这里俯瞰什么!日期转换不可能那么难! :) 但似乎它太麻烦了。 我得到一个这样的字符串: 2013 年 8 月 9 日上午 6:44:01:950

我正在尝试使用此代码将其转换为日期:

[Date_Converter getDateFromString:date withFormat:@"MMM dd YYYY HH:mm:ss:SSSa"]

而在 DateConverter.m

+(NSDate *) getDateFromString:(NSString *) strDate
                   withFormat:(NSString *) format 

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:format];
    //[formatter setTimeZone:[NSTimeZone localTimeZone]];
    NSDate *dateFromStr = [formatter dateFromString:strDate];
    return dateFromStr;

上述方法得到的NSDate返回值是这样的! 2013-01-04 19:14:01 +0000

对于输入日期 2013 年 8 月 9 日上午 6:44:01:950

这怎么可能?对于各种其他格式的日期,我已经多次使用相同的方法。请帮忙。我在这里俯瞰什么?

更新 将格式更改为

[Date_Converter getDateFromString : date
       withFormat : @"MMM dd yyyy hh:mm:ss:SSSa"];

但它仍然返回 null。请帮忙。

最后的帮助 添加 [格式化程序 setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]]; 按照@MartinR 下面的建议进行迄今为止的转换!

【问题讨论】:

你在使用 NSLog 打印日期吗? 使用yyyy,而不是YYYY。并使用hh,而不是HH。顺便说一句,您是坚持使用这种日期格式,还是可以将其更改为使用更标准的格式? 它来自另一个我无法控制的系统。所以,我被困住了。让我试试@Rob。谢谢! 谢谢@Rob!你的回答帮助了我!您可以将其发布为答案,以便我将其标记为正确吗?你是第一个正确回答的! @Jean 谢谢。 Martin R 发布了the same answer,所以你应该随时接受他的。不会冒犯。 【参考方案1】:

您的日期格式有两个错误:

年份的正确格式是yyyy,而不是YYYY。 上午/下午 12 小时时间的格式是 hh,而不是 HH

更新:另外,为了避免对当前语言环境的依赖,添加

[formatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]];

如果您有使用英文月份名称/缩写的固定输入格式。

【讨论】:

我尝试了格式 @"MMM dd yyyy hh:mm:ss:SSSa" -> 它仍然返回 null。请问有什么指导吗? @Jean:可能是语言环境问题。尝试像 ***.com/a/18258115/1187415 一样添加 [formatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]];,看看是否有帮助。 是的,看起来就是这样!一旦我添加了 initwithlocaleidentifier 现在就可以工作了!谢谢!【参考方案2】:

检查一下..

  NSString *date = @"Aug 9 2013 06:44:01:950AM"; 

 [Date_Converter getDateFromString:date withFormat:@"MMM dd yyyy HH:mm:ss:SSSa"];//only you need to lower the char(yyyy) and it will be fine .

这是输出

date = 2013-08-09 00:44:01 +0000

谢谢:)

【讨论】:

【参考方案3】:

NSDate 的目标 c 中,如果您没有设置 setTimeZoneNSDate 将采用默认时区作为 localTimeZone。因此,如果您需要获取以NSString 字符串格式提供的确切日期,则需要将TimeZone 设置为UTC。按照示例代码,我想它会对你有所帮助。

NSDateFormatter *loacalformatter=[[NSDateFormatter alloc]init];
[loacalformatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSDate *localDate =[loacalformatter dateFromString:@"2013-01-04 19:14:01"];
NSLog(@"localDate :%@",localDate);


NSDateFormatter *UTCformatter=[[NSDateFormatter alloc]init];
[UTCformatter setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];
[UTCformatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSDate *UTCDate =[UTCformatter dateFromString:@"2013-01-04 19:14:01"];
NSLog(@"UTCDate :%@",UTCDate);

UTC日期:2013-01-04 19:14:01 +0000 (GMT+00:00)

【讨论】:

虽然这是一个有趣的观察结果,但 OP 的问题是输入日期是“2013 年 8 月 9 日”,结果是“2013-01-04”!这不是时区问题。他的日期格式字符串有一个更根本的问题。 是的,使用 YYYY 似乎很糟糕。

以上是关于iOS:日期转换导致日期错误的主要内容,如果未能解决你的问题,请参考以下文章

防止日期转换溢出

将字符串转换为日期时间错误 [重复]

SQL Server 将字符串转换为日期时间

获取错误从字符串转换日期和/或时间时转换失败

iOS - 日期格式导致年份+1

iOS日期转换器返回正确的日期[重复]