获取所选时区的时间和日期?

时间:2012-09-05 10:14:42

标签: objective-c

我尝试了下面的代码片段,我正在获取系统的当前日期和时间,而不是所选的时区代码。

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;` 

有什么想法吗?

2 个答案:

答案 0 :(得分: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从日期创建表示巴黎,悉尼等当地时间的日期字符串: / p>

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

答案 1 :(得分:0)

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

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

修改

另一方面,如果您只想显示时区名称,只需将'z'设为大写。

修改

小写'z'适用于所有其他时区,但遗憾的是GMT是一个特殊情况。因此,最简单的方法是省略'z'并将“GMT”附加到格式化的日期。