0

我已经搜索并没有找到像我这样的确切问题,所以这里什么都没有:

我有一个 NSString ,其中包含我从 XML 提要中提取的密钥。关键是 24 小时格式的时间(例如 13:30 或 15:00。)我想将 NSString 转换为 NSDate 并根据设备设置的时区将其转换为适当的时区。关键是 Unicode HH:mm (24:00),所以我很好奇为什么这不能正常工作。

我已经得到了一个应该可以工作的基本大纲,但可惜没有。第二个 NSLog(得到 NS 日期)返回 null,最后一个日志返回一个奇怪的数字(准确地说是 1969-12--2147483629 -596:-31:-23 +0000。)我在这里做错了什么?

提前致谢,

    NSString *dateString = [dict objectForKey:@"24hrdate"];
    NSLog(@"NSString Date: %@", dateString);

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];    
    [formatter setDateFormat:@"HH:mm"];
    NSDate *sourceDate = [formatter dateFromString:dateString]; 
    NSLog(@"Got NS Date: %@", sourceDate);

    NSTimeZone *sourceTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
    NSTimeZone *destinationTimeZone = [NSTimeZone systemTimeZone];

    NSInteger sourceGMTOffset = [sourceTimeZone secondsFromGMTForDate:sourceDate];
    NSInteger destinationGMTOffset = [destinationTimeZone secondsFromGMTForDate:sourceDate];
    NSTimeInterval interval = destinationGMTOffset - sourceGMTOffset;

    NSDate* destinationDate = [[[NSDate alloc] initWithTimeInterval:interval sinceDate:sourceDate] autorelease];
    NSLog(@"Final Date: %@", destinationDate);
4

3 回答 3

0

首先要了解日期组件将是01-01-1970因为它没有提供。我假设您希望04:00 GMT输入字符串为@"04:00". 您可以通过设置格式化程序的时区来实现。

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];    
[formatter setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];
[formatter setDateFormat:@"HH:mm"];
NSDate *sourceDate = [formatter dateFromString:dateString]; 
于 2011-06-29T06:35:55.643 回答
0

NSDate用于表示日期和时间。虽然你可以通过坚持午夜来代表一个日期,但你不能真正用它来代表一天中的某个时间。你可以在 Mac 上伪造这个(它默认为某个合理的日期),但在 iOS 上你会得到非常不准确的时间。(至少,您在某些版本上会这样做。这可能已被修复。)

这里有两种方法:

  1. NSDateComponents您可以从一天中的时间构建一个,并将dateByAddingComponents其添加到您希望时间出现的日期的午夜。这将无法返回您在夏令时开始或结束的那一天所期望的时间。

  2. 您可以使用所需的日期 ( NSDate) 和时间(可能是NSString)来构建日期/时间字符串。

- (NSDate *)timeInHours: (NSInteger)hours
                minutes: (NSInteger)minutes
                seconds: (NSInteger)seconds
                 onDate: (NSDate *)inDate;
{
    id timeStr = [[NSMutableString alloc] initWithFormat: @"%02d:%02d:%02d", hours, minutes, seconds];
    id dateStr = [dateWithoutTimeFormatter stringFromDate: inDate];
    id dateTimeStr = [[NSString alloc] initWithFormat: @"%@ %@", dateStr, timeStr];
    [timeStr release];
    id dateTime = [dateWithTimeFormatter dateFromString: dateTimeStr];
    [dateTimeStr release];
    return dateTime;
}

如果您真的只想要一天中的时间,只需将其作为字符串保留即可。

于 2011-06-29T06:39:04.130 回答
0

只是想回帖说我确实设法实现了我最初打算做的事情,没有任何问题。基本上,我必须将字符串转换为 NSDate,通过 NSDateFormatter 运行该 NSDate(设置为时间的原始时区——NSDateFormatter 的 setTimeZone 很有帮助),从中拉出一个 NSDate,然后通过另一个 NSDateFormatter 运行该设备的时区. 然后我将生成的 NSDate 转换回 NSString,并将其粘贴在 UILabel 上。

该解决方案似乎效果很好,因为我已将设备设置为不同的时区,并且时区更改仍然正确。

编辑:这也很重要:

NSString *date…….
date = [date stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
于 2011-06-30T07:31:50.740 回答