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 中,如果您没有设置 setTimeZone
,NSDate
将采用默认时区作为 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:日期转换导致日期错误的主要内容,如果未能解决你的问题,请参考以下文章