iOs中的NSDate转换问题

时间:2012-05-30 09:42:19

标签: iphone nsdate nsdateformatter nstimeinterval

我有一个代表NSTimeInterval的双精度值。我想从double值创建正确的日期,这是我的代码。我得到了输出,但实际值有一些变化。

NSString *modiDate = [NSString stringWithFormat:@"1338229800"]; //example time interval value

NSNumber *time = [NSNumber numberWithDouble:([modiDate doubleValue] - 3600)];
NSTimeInterval interval = [time doubleValue];    
NSDate *online = [NSDate date];
online = [NSDate dateWithTimeIntervalSince1970:interval];    
NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
[dateFormatter setDateFormat:@"MM/dd/yyyy HH:mm:ss aaa"];

NSLog(@"result: %@", [dateFormatter stringFromDate:online]);

这里出了什么问题?有什么想法吗?

修改 为了进行测试,我首先将日期转换为NSTimeInterval并尝试取回日期。 这是代码和输出。

NSString *modDate = [NSString stringWithFormat:@"5/30/2012 2:02:55 PM"];

NSDateFormatter *format = [[NSDateFormatter alloc]init];
[format setDateFormat:@"MM/dd/yyyy HH:mm:ss aaa"];
NSDate *dateFromString1 = [[NSDate alloc] init];
dateFromString1 = [format dateFromString:modDate];
[format release];
NSTimeInterval timeInterval1 = [dateFromString1 timeIntervalSince1970];

NSLog(@"timeinterval : %f",timeInterval1);

NSDate *online = [NSDate date];
online = [NSDate dateWithTimeIntervalSince1970:timeInterval1];    
NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
[dateFormatter setDateFormat:@"MM/dd/yyyy HH:mm:ss aaa"];

NSLog(@"result: %@", [dateFormatter stringFromDate:online]);

,输出为:

 result: 05/30/2012 12:02:55 PM actual date:5/30/2012 2:02:55 PM

3 个答案:

答案 0 :(得分:4)

首先,NSTimeInterval是一个浮点数,因此您不需要使用NSString或NSNumber(NSNumber用于在字典或数组中存储数字)。

您可以将代码简化为:

NSTimeInterval interval = 1338229800;
interval -= 3600;
NSDate *online = [NSDate dateWithTimeIntervalSince1970:interval];
NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
[dateFormatter setDateFormat:@"MM/dd/yyyy HH:mm:ss aaa"];
NSLog(@"result: %@", [dateFormatter stringFromDate:online]);

这给了我:05/28/2012 19:30:00 PM

它对应于初始值:1338229800减1小时( - 3600秒)。

编辑:

在你的编辑中,你的写作:

NSString *modDate = [NSString stringWithFormat:@"5/30/2012 2:02:55 PM"];
NSDateFormatter *format = [[NSDateFormatter alloc]init];
[format setDateFormat:@"MM/dd/yyyy HH:mm:ss aaa"];

但你应该检查the date format paterns page
2:02:55 PM对应@"h:mm:ss a",而不是 "HH:mm:ss aaa"

答案 1 :(得分:1)

这段代码有很多问题:

为什么要创建所有这些对象:

NSString *modiDate = [NSString stringWithFormat:@"1338229800"]; //example time interval value
NSNumber *time = [NSNumber numberWithDouble:([modiDate doubleValue] - 3600)];
NSTimeInterval interval = [time doubleValue];   

如果相同:

 NSString *modiDate = [NSString stringWithFormat:@"1338229800"];
 NSTimeInterval interval = [modiDate doubleValue]  - 3600;

在这里你要确定一个新的在线日期:

NSDate *online = [NSDate date];

仅在此处将其他日期设置为在线:

online = [NSDate dateWithTimeIntervalSince1970:interval];  

你应该这样做:

NSDate *online = [NSDate dateWithTimeIntervalSince1970:interval];  

我确定您对此代码的问题,但它可以正常工作。 您可能想要设置区域设置,而不是真正需要,但可能会对本地化产生一些影响:

NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
dateFormatter.locale = [NSLocale systemLocale];
[dateFormatter setDateFormat:@"MM/dd/yyyy HH:mm:ss aaa"];

NSLog(@"result: %@", [dateFormatter stringFromDate:online]);

从编辑中添加了新代码

在您的编辑中,您添加了以下代码:

NSDate *dateFromString1 = [[NSDate alloc] init];
dateFromString1 = [format dateFromString:modDate];

在这里你泄漏了一个NSDate对象,只需这样做:

NSDate *dateFromString1 = [format dateFromString:modDate];

martin的答案中陈述的问题是时间格式字符串。

答案 2 :(得分:0)

你正在使用24小时的HH。而是使用适合AM / PM格式的hh(0-12)。