2011-04-13 45 views

Trả lời

23
NSDate *sourceDate = [NSDate dateWithTimeIntervalSinceNow:3600 * 24 * 60]; 
NSTimeZone* destinationTimeZone = [NSTimeZone systemTimeZone]; 
float timeZoneOffset = [destinationTimeZone secondsFromGMTForDate:sourceDate]/3600.0; 
NSLog(@"sourceDate=%@ timeZoneOffset=%d", sourceDate, timeZoneOffset); 
+4

Có hai vấn đề tiềm ẩn với mã này: (1) nó thực sự nên sử dụng "localTimeZone" thay vì "systemTimeZone" (thường kết thúc bằng nhau). (2) sourceDate phải là [NSDate date], tôi đã gặp phải vấn đề trong đó timeZoneOffset bị sai bởi một giờ khi sử dụng ngày off-by-ngày đã cho. Bạn có thể giải thích tại sao bạn sử dụng ngày nguồn khác nhau theo ngày không? –

59

Có một đối tượng NSTimeZone rất đẹp mà sẽ cung cấp cho bạn các múi giờ bù đắp từ giờ chỉ trong vài giây:

float timezoneoffset = ([[NSTimeZone systemTimeZone] secondsFromGMT]/3600.0); 

Để biết thêm xem bài đăng blog

http://blog.indieiphonedev.com/2011/01/09/getting-the-timezone-on-the-device/

+7

Hãy nhớ rằng bù đắp không nhất thiết phải là một số nguyên - số các quốc gia có khoảng thời gian nghỉ một nửa (hoặc quý) (tôi thấy bài đăng đó đề cập đến nó, chỉ trong trường hợp mọi người không đọc được). –

+2

Chỉ muốn thêm rằng mã này tránh một số cạm bẫy tiềm năng của câu trả lời được đánh dấu là chính xác. –

+1

Liên kết tới bài đăng trên blog trong câu trả lời đã chết. – Pang

7

Đừng sử dụng một int !!! Tôi đã sao chép mã này và hiện có lỗi trong ứng dụng của mình. Một số múi giờ là 0,5 giờ

sử dụng này:

float offset = [timezone secondsFromGMTForDate:self.date]/3600.0; 

và đừng quên các .0 đằng sau 3600

15

Đối với bất cứ ai tìm kiếm các múi giờ hiện tại bù đắp như là một chuỗi, hãy thử:

NSDateFormatter *localTimeZoneFormatter = [NSDateFormatter new]; 
localTimeZoneFormatter.timeZone = [NSTimeZone localTimeZone]; 
localTimeZoneFormatter.dateFormat = @"Z"; 
NSString *localTimeZoneOffset = [localTimeZoneFormatter stringFromDate:[NSDate date]]; 

Trong múi giờ của tôi, localTimeZoneOffset chứa -0700

+2

Cảm ơn. Đã lưu giờ của tôi. –

1
-(void)getDeviceUTCOffset{ 

    NSDate *date = [NSDate date]; 
    NSTimeZone* deviceTimeZone_ = [NSTimeZone systemTimeZone]; 
    float offset = [deviceTimeZone_ secondsFromGMTForDate:date]/3600.0; 
} 

Để kiểm tra mã - thử nghiệm trên một thiết bị

thay đổi thiết bị múi giờ trong

Settings > General > Date Time 
Turn off SET AUTOMATICALLY 
Then tap TimeZone and choose major cities east/west of you 
Run code and check float offset 

Hãy so sánh giá trị cho các thành phố trên trang web này

ví dụ heres Helsinki

Chuẩn múi giờ: UTC/GMT +2 giờ - như của tháng mười một

http://www.timeanddate.com/worldclock/city.html?n=101

tra chống lại các quốc gia có giờ mùa hè Anh hoặc tương đương của họ.

3

Sử dụng NSTimeZone của localTimeZon e

NSTimeZone *timeZone = [NSTimeZone localTimeZone]; 
NSInteger seconds = [timeZone secondsFromGMT]; 
NSLog(@"TZ : %@ : Seconds %ld",[timeZone abbreviation],(long)seconds); 

int h = (int)seconds/3600; 
int m = (int)seconds/60 % 60; 

NSString *strGMT = @""; 
if (h>=0) 
    strGMT = [NSString stringWithFormat:@"+%02d:%02d", h, m]; 
else 
    strGMT = [NSString stringWithFormat:@"%03d:%02d", h, m]; 

NSLog(@"GMT -/+ HH:mm: %@",strGMT); 
+0

Đoạn mã trên không tạo ra các giá trị chính xác cho các giây âm tínhTừGMTG và các số không khác. Tôi sẽ đề nghị thay thế điều kiện bằng 'if (0 <= giây)' và câu lệnh 'else' bằng' strGMT = [NSString stringWithFormat: @ "-% 02d:% 02d", -h, -m]; ' –

0

Dưới đây là một cách dễ dàng để làm điều này trong Swift 3:

let offsetInHours = Double(TimeZone.current.secondsFromGMT())/3600.0

Các vấn đề liên quan