0

我正在从远程服务器检索一些日期。不幸的是,其中一种可能的格式只是 h:mm:a

我昨天 2013 年 5 月 21 日下载的数据示例:

1) 美国东部时间下午 4:36

2) 美国东部时间晚上 11:51

数据服务器 TimeZone 是“America/New_York”。

我的数据时区是“欧洲/罗马”。

这是我编写的代码,直到今天早上 5 点我还认为它有效:

NSDate *myDate = @"04:36PM EDT"; //11:51PM EDT (I know the date is May, 21 2013 but it is not in the data!)

NSArray *component = [mydate componentsSeparatedByString:@" "];

//Remove any reference to the TimeZone
//set it in the dateFormatter

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat =@"MM dd yyyy h:mma";
dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
dateFormatter.timeZone = [[NSTimeZone alloc] initWithName:@"America/New_York"];

//Create a valid date for the hour

NSDate *date = [NSDate date];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *dateComponents = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:date];

NSDate *dateObject = [self.dateFormatter dateFromString: [NSString stringWithFormat:@"%u %u %u %@",
                dateComponents.month,
                dateComponents.day,
                dateComponents.year,
                [component objectAtIndex:0]]];

//Convert to local timeZone             

dateFormatter.timeZone = [NSTimeZone localTimeZone]; //  @"Europe/Rome"
dateFormatter.dateStyle = NSDateFormatterShortStyle;
dateFormatter.timeStyle = NSDateFormatterLongStyle;


NSString *localTimeZoneDate = dateFormatter stringFromDate:[dateObject];

NSLog(@"Local Time Zone Date = %@", localTimeZoneDate);

输出

虽然昨天代码似乎运行良好,因为当我进行测试时,我仍然处于 6 小时的时间跨度内,这让我保持在同一天,即 5 月 21 日,今天早上我发现它没有。问题在于创建正确的日期。

1) 美国东部时间下午 4:36 ----> 22 /05/2013 22:36:00 CEST

正确的输出应该是21 /05/2013 22:36 CEST

2) 美国东部时间晚上 11:51 ----> 23 /05/2013 05:51:00 CEST

正确的输出应该是22 /05/2013 05:51 CEST

处理这种特殊情况的最佳代码是什么?

谢谢

尼古拉

4

3 回答 3

0

我还没有检查过,但我认为这是因为您创建的日历适用于您所在的时区。在取出日期组件之前尝试将日历时区设置为美国/纽约。

于 2013-05-23T09:37:03.057 回答
0

尝试

NSString *dateString = @"04:36PM EDT"; //11:51PM EDT (I know the date is May, 21 2013 but it is not in the data!)

NSArray *component = [dateString componentsSeparatedByString:@" "];

//Remove any reference to the TimeZone
//set it in the dateFormatter

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat =@"MM dd yyyy";
dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
dateFormatter.timeZone = [[NSTimeZone alloc] initWithName:@"America/New_York"];

NSString *tempDateString = [dateFormatter stringFromDate:[NSDate date]];
dateString = [tempDateString stringByAppendingFormat:@" %@",component[0]];

dateFormatter.dateFormat =@"MM dd yyyy hh:mma";
NSDate *tempDate = [dateFormatter dateFromString:dateString];

dateFormatter.timeZone = [NSTimeZone localTimeZone]; 
dateFormatter.dateStyle = NSDateFormatterShortStyle;
dateFormatter.timeStyle = NSDateFormatterLongStyle;

NSString *localDateString = [dateFormatter stringFromDate:tempDate];

NSLog(@"Local Time Zone Date = %@", localDateString);
于 2013-05-22T07:02:42.850 回答
0

现在我正在这样做:我查看本地时间重新创建的日期是否在本地时间当前时间的未来。如果是的话,从重新创建的日期中删除一天或多天就足够了。

于 2013-05-24T10:43:31.837 回答