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

有任何想法吗?

4

2 回答 2

1

[NSDate date] 返回代表当前日期和时间的日期对象,无论您身在何处。NSDate 不受地点或时区的限制。只有一个 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
于 2012-09-05T10:32:23.373 回答
0
[dateFormatter setDateFormat:@"EEE, d MMM yyyy HH:mm:ss z"];

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

编辑

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

编辑

小写“z”适用于所有其他时区,但不幸的是 GMT 是一个特例。因此,最简单的做法是省略“z”并将“GMT”附加到格式化日期。

于 2012-09-05T10:18:34.393 回答