0

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

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
4

3 回答 3

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 减去一小时(- 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"];

但是你应该检查日期格式模式页面
2:02:55 PM对应@"h:mm:ss a"而不是"HH:mm:ss aaa"

于 2012-05-30T09:55:37.793 回答
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];

正如马丁在回答中所说的那样,问题出在时间格式字符串中。

于 2012-05-30T09:57:33.780 回答
0

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

于 2012-05-30T10:09:57.067 回答