2012-09-05 46 views
0

我试过下面的代码片段我得到系统的当前日期和时间而不是选定的时区代码。获取所选时区的时间和日期?

NSDate *now = [NSDate date]; 
NSCalendar *gregorian=[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
[gregorian setTimeZone:[NSTimeZone timeZoneWithName:selectedzone]]; 

NSDateComponents* timeZoneComps = [gregorian components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit|NSHourCalendarUnit|NSMinuteCalendarUnit|NSSecondCalendarUnit|NSTimeZoneCalendarUnit fromDate:now]; 

NSDate *selectedDate=[gregorian dateFromComponents:timeZoneComps]; 
NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
[formatter setDateStyle:NSDateFormatterFullStyle]; 
[formatter setDateFormat:@"dd-MM-yyyy HH:mm:ss "]; 
NSString *strSelectedDate= [formatter stringFromDate:selectedDate]; 
setZone.text = strSelectedDate;` 

任何想法?

回答

1

[NSDate date]返回表示当前日期和时间的日期对象,无论您身处何处。 NSDates不受地点或时区的限制。只有一个NSDate代表现在或任何其他时刻,而不是每个时区的不同日期对象。因此,您不应尝试在时区之间转换日期。

NSDate objects represent an absolute instant in time. Consider the following example of how two date representations in different time zones (9/9/11 3:54 PM in Paris and 9/9/11 11:54 PM in Sydney) are actually the same date. 
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
    [formatter setDateStyle:NSDateFormatterShortStyle]; 
    [formatter setTimeStyle:NSDateFormatterShortStyle]; 
    [formatter setTimeZone:[NSTimeZone timeZoneWithName:@"Europe/Paris"]]; 
    NSDate *aDate = [formatter dateFromString:@"9/9/11 3:54 PM"]; 
    [formatter setTimeZone:[NSTimeZone timeZoneWithName:@"Australia/Sydney"]]; 
    NSDate *anotherDate = [formatter dateFromString:@"9/9/11 11:54 PM"]; 
    NSLog(@"%@",anotherDate); 
    if ([aDate isEqualToDate:anotherDate]) { 
     NSLog(@"How about that?"); 
    } 

当涉及到输出的日期,谨记的NSDate的描述方法GMT返回时间,你需要使用NSDateFormatter创建代表在巴黎,悉尼等。从本地时间日期字符串日期:

NSDate *now = [NSDate date]; 
NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
[formatter setDateStyle:NSDateFormatterShortStyle]; 
[formatter setTimeStyle:NSDateFormatterShortStyle]; 
[formatter setTimeZone:[NSTimeZone timeZoneWithName:@"Australia/Sydney"]]; 
NSLog(@"%@",[formatter stringFromDate:now]); //--> 9/9/11 11:54 PM 
[formatter setTimeZone:[NSTimeZone timeZoneWithName:@"Europe/Paris"]]; 
NSLog(@"%@",[formatter stringFromDate:now]); //--> 9/9/11 3:54 PM 
+0

这是你想要的吗? – prashant

+0

非常感谢,非常感谢 –

0
[dateFormatter setDateFormat:@"EEE, d MMM yyyy HH:mm:ss z"]; 

如果您不想显示时区,请从格式字符串中删除尾部'z'字符。

编辑

在另一方面,如果你只是想显示的时区的名称,只是使“Z”大写。

编辑

小写字母“Z”工作正常,所有其他时区,但不幸的是GMT是一个特例。所以最简单的做法就是省略'z'并在格式化的日期附加“GMT”。

+0

我做了改变,但其显示当前时间和系统的日期没有选择时区的时间或日期 –

+0

NSDateFormatter *格式化= [[NSDateFormatter的alloc] INIT]; [formatter setDateStyle:NSDateFormatterShortStyle]; [formatter setTimeStyle:NSDateFormatterShortStyle]; [formatter setTimeZone:[NSTimeZone timeZoneWithName:@“Europe/Paris”]]; NSDate * aDate = [formatter dateFromString:@“9/9/11 3:54 PM”]; [formatter setTimeZone:[NSTimeZone timeZoneWithName:@“Australia/Sydney”]]; NSDate * anotherDate = [formatter dateFromString:@“9/9/11 11:54 PM”]; NSLog(@“%@”,anotherDate);如果([aDate isEqualToDate:anotherDate]){ NSLog(@“那怎么样?”); } – prashant