从服务器上的字符串获取NSDates

时间:2014-07-08 12:28:50

标签: ios nsdate nsdateformatter nstimezone

我在服务器上有一些日期字符串,我想在我的应用程序中解析,获取日期并将其显示在我的应用程序所具有的日历上,而不是设备日历。

要做到这一点,我这样做

    _dateFromatter = [[NSDateFormatter alloc] init];
    [_dateFromatter setDateFormat:@"dd-MMM-yyyy"];
    [_dateFromatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]]; 
    [_dateFromatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];   


    _gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
    [_gregorian setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; 


    NSDate *historyDate  = [_dateFromatter dateFromString:[data objectForKey:@"dateStringFromServer"]];

    if(historyDate != nil)
    {
         NSDateComponents *weekdayComponents = [_gregorian components:(NSDayCalendarUnit | NSWeekdayCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit)fromDate:historyDate];

         NSInteger year  = [weekdayComponents year];
         NSInteger month = [weekdayComponents month];
         NSInteger day   = [weekdayComponents day];

         NSDateComponents *timeZoneComps=[[NSDateComponents alloc] init];
         [timeZoneComps setYear:year];
         [timeZoneComps setMonth:month];
         [timeZoneComps setDay:day];
         [timeZoneComps setHour:00];
         [timeZoneComps setMinute:00];
         [timeZoneComps setSecond:01];

         NSDate *convertedHistoryDate =[_gregorian dateFromComponents:timeZoneComps];
    }

我在断点处执行停止时添加断点并进行一些检查。

现在,在服务器上,字符串是2014年7月8日,如果我鼠标悬停在我看到2014-07-08 05:30:00 IST的日期,如果我点击信息我得到2014-07- 08 00:00:00 +0000,

其次现在如果我将NSCalendar和dateformatter的时区更改为本地时区,如果我检查得到这个2014-07-08 00:00:00 IST和内部信息我得到2014-07-07 18:30:00 + 0000

所以我不理解这两种情况。此外,我想知道每当我从服务器获取日期时,时区是否重要以及它应该是什么时区?

因为我的用户可以在任何时区?所以当他们同步数据时,他们应该得到服务器上的任何日期。我的意思是如果服务器上存在2014年7月8日,那么如果美国用户正在同步它不应该在7月7日 - 2014年它应该只保留8 -Jul -2014。

此致 兰吉特

1 个答案:

答案 0 :(得分:0)

关于日期,它们实际上是由不同的时区表示的。

2014-07-08 05:30:00 IST/+05:30
2014-07-08 00:00:00 +0000

2014-07-08 00:00:00 IST/+05:30 
2014-07-07 18:30:00 +0000

您需要在将日期转换为字符串时将格式化程序时区设置为正确,反之亦然......

[inputDateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];//server timezone
[outputDateFormatter setTimeZone:[NSTimeZone systemTimeZone]];//user's timezone