2013-08-25 35 views
19

Từ các tài liệu:Hiểu UILocalNotification TimeZone

Ngày quy định tại fireDate được hiểu theo giá trị bộ khách sạn này. Nếu bạn chỉ định nil (mặc định), ngày lửa là được hiểu là giờ GMT tuyệt đối, phù hợp với các trường hợp như làm bộ đếm thời gian đếm ngược. Nếu bạn gán một đối tượng NSTimeZone hợp lệ cho thuộc tính này, ngày lửa được hiểu là thời gian đồng hồ treo tường là được điều chỉnh tự động khi có thay đổi về múi giờ; một ví dụ phù hợp cho trường hợp này là một đồng hồ báo thức.

Giả sử tôi lên lịch thông báo địa phương (trong thời gian tuyệt đối) buổi trưa ngày mai GMT. Tôi lên lịch tại Seattle lúc 1 giờ chiều (giờ Thái Bình Dương, GMT-8), sau đó ngay lập tức đi đến Chicago đến 11 giờ tối (Giờ Trung tâm, GMT-6). Thiết bị của tôi điều chỉnh từ Giờ Thái Bình Dương thành Giờ Trung tâm. Vui lòng giúp tôi hiểu khi nào thông báo của tôi sẽ xuất hiện trong ba trường hợp sau:

  1. UILocalThời gian thông báoZone được đặt thành không.
  2. UILocalThời gian thông báoZone được đặt thành GMT.
  3. UILocalThời gian thông báoZone được đặt thành Giờ Thái Bình Dương.

Trả lời

41

Tôi vừa chạy một số thử nghiệm trên iOS 6.1.3. Dưới đây là những gì tôi nhận được:

Tôi đang ở Seattle, lúc 1:00 chiều (Giờ ban ngày Thái Bình Dương, GMT-7). Tôi tạo ra một NSDate:

NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 

NSDateComponents *dateComponents = [[NSDateComponents alloc] init]; 
// 2013-08-31 @ 12:00:00 (noon) 
dateComponents.year = 2013; 
dateComponents.month = 8; 
dateComponents.day = 31; 
dateComponents.hour = 12; 
dateComponents.minute = 0; 
dateComponents.second = 0; 

NSDate *fireDate = [gregorianCalendar dateFromComponents:dateComponents]; 

bây giờ tôi có

fireDate = 2013-08-31 19:00:00 +0000 (2013-08-31 12:00:00 -0700) 

Sau đó, tôi tạo ra và sắp xếp các thông báo:

notification1 = [[UILocalNotification alloc] init]; 
notification1.fireDate = fireDate; 
// notification1.timeZone is nil by default 

NSLog(@"%@", notification1); 

notification2 = [[UILocalNotification alloc] init]; 
notification2.fireDate = fireDate; 
notification2.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"]; 

NSLog(@"%@", notification2); 

notification3 = [[UILocalNotification alloc] init]; 
notification3.fireDate = fireDate; 
notification3.timeZone = [NSTimeZone defaultTimeZone]; 

NSLog(@"%@", notification3); 

Logs các thông báo vừa tạo, tại thành phố Seattle (Pacific Daylight Time , GMT-7):

notification1: 
fire date = Saturday, August 31, 2013, 12:00:00 PM Pacific Daylight Time, 
time zone = (null), 
next fire date = Saturday, August 31, 2013, 12:00:00 PM Pacific Daylight Time 

notification2: 
fire date = Saturday, August 31, 2013, 7:00:00 PM GMT, 
time zone = GMT (GMT) offset 0, 
next fire date = Saturday, August 31, 2013, 7:00:00 PM Pacific Daylight Time 

notification3: 
fire date = Saturday, August 31, 2013, 12:00:00 PM Pacific Daylight Time, 
time zone = US/Pacific (PDT) offset -25200 (Daylight), 
next fire date = Saturday, August 31, 2013, 12:00:00 PM Pacific Daylight Time 

Tôi đã thay đổi múi giờ của điện thoại thành Chicago, hiện giờ là 3 giờ chiều (Giờ ban ngày miền Trung, GMT-5).

Logs các thông báo, ở Chicago (Trung Daylight Time, GMT-5)

notification1: 
fire date = Saturday, August 31, 2013, 2:00:00 PM Central Daylight Time, 
time zone = (null), 
next fire date = Saturday, August 31, 2013, 2:00:00 PM Central Daylight Time 

notification2: 
fire date = Saturday, August 31, 2013, 7:00:00 PM GMT, 
time zone = GMT (GMT) offset 0, 
next fire date = Saturday, August 31, 2013, 7:00:00 PM Central Daylight Time 

notification3: 
fire date = Saturday, August 31, 2013, 12:00:00 PM Pacific Daylight Time, 
time zone = US/Pacific (PDT) offset -25200 (Daylight), 
next fire date = Saturday, August 31, 2013, 12:00:00 PM Central Daylight Time 

Kết luận:

  1. Khi UILocalNotification timeZone là con số không, ngày đám cháy được cố định trong thời gian. Điều đó có nghĩa là thông báo sẽ được kích hoạt lúc 12:00 CH GMT-7, 2:00 CH GMT-5 hoặc 7:00 GMT.
  2. Khi UILocalNotification timeZone được đặt thành GMT, ngày lửa được tính theo giờ GMT và sẽ tự động cập nhật nếu người dùng chuyển đến múi giờ khác. Trong ví dụ này, thời gian 12:00 GMT-7 được chuyển đổi thành 19:00 GMT và thông báo được đặt thành 19:00 giờ địa phương, bất kể múi giờ nào chúng tôi là (19:00 GMT, 19:00 GMT-5 hoặc 19:00 GMT-7).
  3. Khi UILocalNotification timeZone được đặt thành múi giờ địa phương (Giờ ban ngày Thái Bình Dương, GMT-7), ngày lửa được tính theo giờ địa phương và sẽ tự động cập nhật nếu người dùng chuyển đến múi giờ khác. Trong ví dụ này, thời gian là 12:00 GMT-7, vì vậy thông báo sẽ được kích hoạt vào lúc 12:00 giờ địa phương, bất kể múi giờ nào chúng tôi là (12:00 GMT, 12:00 GMT-5 hoặc 12:00 GMT- 7).
+0

Tuyệt vời. Về mặt kỹ thuật, bạn đã lên lịch cho 7 giờ chiều giờ GMT thay vì buổi trưa, nhưng nó cũng trả lời câu hỏi. –

+1

Có ai có cuộc điều tra tương tự về ngày kích hoạt UNNotification trong iOS 10 không? – Jonny

+0

@Jonny Tôi cũng tự hỏi điều đó. Dường như việc đặt múi giờ không có sự khác biệt. – David

0

Trong Swift 3, sử dụng TimeZone.autoupdatingCurrent để hoạt động giống như mục tiêu-C [NSTimeZone defaultTimeZone].

+0

Điều này không trả lời OP. Bạn có thêm thông tin nào không. – David

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