2016-03-01 64 views
0

我的应用程序从后端获取一些时间段并将其转换为当前时区(PST)并显示。一切工作都很完美,直到白天节省时间开始。将夏令时转换为UTC时间为PST?

在iOS中有没有办法像给我这个UTC的PST日期和时间,它会自动处理夏令时。目前它转换得很好,但仍然给我一个小时。

下面是我在做什么:

-(NSDate *) toLocalTime:(NSDate*) currentDate 
{ 
    NSTimeZone *tz = [NSTimeZone timeZoneWithName:@"US/Pacific"]; 
    NSInteger seconds = [tz secondsFromGMTForDate: currentDate]; 
    return [NSDate dateWithTimeInterval: seconds sinceDate: currentDate]; 
} 

编辑

改变了我的代码,这一点,但还是同样的结果:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init]; 
    dateFormatter.dateFormat = @"MM/dd/yyyy HH:mm:ss"; 
    [dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]]; 

    NSString *startDateString = [[self.slotsArray objectAtIndex:indexPath.row] objectForKey:@"StartDate"]; 
    NSDate *startDate = [dateFormatter dateFromString:startDateString]; 

    dateFormatter.dateStyle = NSDateFormatterMediumStyle; 
    dateFormatter.timeStyle = NSDateFormatterMediumStyle; 
    [dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"America/Los_Angeles"]]; 

    NSString * dateString = [dateFormatter stringFromDate:startDate]; 

例如我正在显示一些时隙对于3月13日,当天光照时间开始。在UTC我得到的时间是17:00,相当于今天的10。但在这种情况下,实时是当天上午9点。我应该如何解决这个问题?

+0

基本上用'NSCalendar'和'NSDateComponents'完成**所有**日历计算,而不是像86400 – vadian

+0

那样使用字面数字这是什么意思,“这种情况下的实际时间将是当天上午9点”?如果你不想做一个简单的时区转换(它会产生10 AM),请描述你想如何转换时间。 –

回答

0

而不是使用US/Pacific尝试America/Los_Angeles替换它,它会自动检测DST并更改时区-7

我工作在一些从服务器获取UTC时间的应用程序,我们从来没有使用过这个问题。

+0

查看我的编辑上面的用例 – Ashutosh

2

我不知道该方法应该做什么,但NSDate没有任何时区信息,所以如果您要从一个时区“调整”一个时区,那么您做错了。为NSDate文档甚至说

的NSDate对象封装在单个时间点,独立于任何特定的历法系统或时区。

如果你有一个NSDate并希望将其呈现给用户在本地时间对于一个给定的时区,你会做这样的事情:

NSDate *date = // from somewhere 

NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
formatter.dateStyle = NSDateFormatterMediumStyle; 
formatter.timeStyle = NSDateFormatterMediumStyle; 
formatter.timeZone = [NSTimeZone timeZoneWithName:@"America/Los_Angeles"]; 

NSString *dateString = [formatter stringFromDate:date]; 

这会给你一个字符串并在给定的时区内输入正确的日期,然后输入NSDate。不要尝试转换NSDate

额外的基于评论

夏令时2016年在美国时间开始于3月13日02:00。在那一刻,时间移动转发一小时。如果以开始日期字符串@"03/12/2016 17:00:00"(时间更改之前)运行上面的代码,最终结果为Mar 12, 2016, 9:00:00 AM。如果使用开始日期字符串@"03/13/2016 17:00:00"(时间更改后)运行它,结果为Mar 13, 2016, 10:00:00 AM

因此,代码通过在DST开始前后返回不同的时间正确调整夏令时,并在夏令时期间正确返回一天中的较晚时间。你似乎得到了同样的结果,所以我不再确定你想要解决什么问题。

+0

看我上面的编辑。通过以上任何一种方式,我认为我得到了今天的正确日期。但今天上午10点将是当天上午9点。但是如果我今天看到它,它会显示我10而不是9.我得到的UTC是17:00:00 – Ashutosh

+0

你能给出一个你开始使用的日期字符串的例子,导致错误的结果吗? –

+0

这是我在startDateString“03/13/2016 17:00:00”中获得的值,然后我的dateString作为“2016年3月13日上午10:00:00 AM”出现,这是正确的,但在那一天它会上午9:00。 – Ashutosh