我在服务器上有一些日期字符串,我想在我的应用程序中解析,获取日期并将其显示在我的应用程序所具有的日历上,而不是设备日历。
要做到这一点,我这样做
_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。
此致 兰吉特
答案 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