- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我需要使用 EventKit 框架在 iPhone 日历中创建条目。
由于我的应用程序应该是国际化的,因此我需要照顾不同的时区。我现在在做什么:
事件应在早上 6:00 开始。因此我用这段代码创建了一个 NSDate 对象:
[NSDate dateWithString:[NSString stringWithFormat:@"%d-%d-%d %d:%d:00 +0000",year,month,day,hour,minute]];
我得到的是一个带有 06:00 am 和 GMT 时区的 NSDate 对象。
当使用这个 NSDate 作为事件的开始日期时,我想使用系统时区,以确保事件在日历中真正显示为早上 06:00。
因此我使用这段代码:
+(NSDate*) convertToSystemTimezone:(NSDate*)sourceDate
{
NSTimeZone* sourceTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
NSTimeZone* destinationTimeZone = [NSTimeZone systemTimeZone];
NSInteger sourceGMTOffset = [sourceTimeZone secondsFromGMTForDate:sourceDate];
NSInteger destinationGMTOffset = [destinationTimeZone secondsFromGMTForDate:sourceDate];
NSTimeInterval interval = destinationGMTOffset - sourceGMTOffset;
NSDate* destinationDate = [[[NSDate alloc] initWithTimeInterval:interval sinceDate:sourceDate] autorelease];
return destinationDate;
}
例如,我将我的设备时区更改为纽约。如果我调试代码,它会正确识别时区和 -14400 秒的偏移量。所以我的开始和结束 NSDate 对象似乎是正确的。
如果我查看日历,该应用会创建一个事件,该事件不是从早上 06:00 开始,而是从凌晨 04:00 开始。
我做错了什么??
编辑:我创建事件的代码:
从 06:00 am 到 08:00 am 创建事件的示例
int year=2011;
int month=6;
int day=26;
int hour=6;
int minute=0;
NSDate *startDate = [NSDate dateWithString:[NSString stringWithFormat:@"%d-%d-%d %d:%d:00 +0000",year,month,day,hour, minute];
startDate=[self convertToSystemTimezone:startDate];
NSDate *endDate = [NSDate dateWithString:[NSString stringWithFormat:@"%d-%d-%d %d:%d:00 +0000",year,month,day,8, minute];
endDate=[self convertToSystemTimezone:endDate];
EKEventStore *eventDB = [[EKEventStore alloc] init];
EKEvent *myEvent = [EKEvent eventWithEventStore:eventDB];
myEvent.title = @"Testevent";
myEvent.startDate = startDate;
myEvent.endDate = endDate;
myEvent.allDay = NO;
[myEvent setCalendar:[eventDB defaultCalendarForNewEvents]];
NSError *err;
[eventDB saveEvent:myEvent span:EKSpanThisEvent error:&err];
[eventDB release];
现有事件的删除未显示,但这已经过测试并且有效。
最佳答案
如果你想保留系统时区的时间,那么这样做,
+(NSDate*) convertToSystemTimezone:(NSDate*)sourceDate {
NSCalendar * calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
[calendar setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];
NSUInteger flags = (NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit );
NSDateComponents * dateComponents = [calendar components:flags fromDate:sourceDate];
[calendar setTimeZone:[NSTimeZone systemTimeZone]];
NSDate * myDate = [calendar dateFromComponents:dateComponents];
return myDate;
}
但我认为您应该查看 localTimeZone
而不是 systemTimeZone
。如果是另一个,您可以在上面的代码片段中更改它。
编辑
为什么需要获取GMT的日期然后进行转换?你不能直接这样做吗?
NSCalendar * calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
NSDateComponents * dateComponents = [[[NSDateComponents alloc] init] autorelease];
[dateComponents setYear:2011];
[dateComponents setMonth:6];
[dateComponents setDay:26];
[dateComponents setHour:6];
[dateComponents setMinute:0];
NSDate * startDate = [calendar dateFromComponents:dateComponents];
[dateComponents setHour:8];
NSDate * endDate = [calendar dateFromComponents:dateComponents];
然后创建并保存 EKEvent
实例。
关于iphone - 使用 EventKit 的 NSTimezone 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6483008/
当我启动我的应用程序时,我将我的默认时区设置为 GMT[NSTimeZone setDefaultTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"GMT
我想在标签上显示“EDT”。我使用了下面的代码,发现它适用于 iphone6、6+ 和 iphone4 (iOS 7.1)。但是在 iPhone5s(iOS 8.2)、iPhone5(iOS 7.1)
我在 OS X 中有时区:欧洲中部夏令时(自动基于位置)。在模拟器上运行我的代码时,我得到了这些结果: NSTimeZone *tz = [NSTimeZone localTimeZone]; //
我想(至少)获取时区的国家/地区名称。任何潜在的方法都没有提供这一点: 姓名, 本地化名称:区域设置:, 描述 我注意到内置的 iPhone 时钟应用程序可以访问此信息,因为它将伦敦描述为“英国伦敦”
什么时候NSTimeZone(name:"US/Eastern")返回nil? 我看到多次崩溃,堆栈跟踪指向我初始化 NSTimeZone 的代码行。我可以添加一个检查来查看它是否为零。但很想知道为什
这个问题在这里已经有了答案: Where is the iPhone's Date & Time getting its time zone list (3 个答案) 关闭 8 年前。 我正在使用
我创建了一个每周 View (类似于日历),其中包含星期几的标题。我正在使用以下代码创建当前时间: +(NSDate *) getCurrentDate { NSDate* datetime
目前GMT-0700(US/pacific)已进入夏令时 但我从 NSTimeZone 得到“否” NSTimeZone *timeZone = [NSTimeZone timeZoneForSeco
我正在编写一个涉及人们出生时间的应用程序,并且我正在尝试使用 IOS 来获取准确的 GMT 偏移量。我得到的答案显然是错误的,我想知道其他人是否遇到过这些问题,或者是否有任何解决方法。 这是我用来计算
任何人都可以告诉我从 systemTimeZone(NSTimeZone) 中提取时区的想法 我已经添加了示例。 NSTimeZone *localTime = [NSTimeZone systemT
对于 PDT,我想要“-0700”。 我正在获取过去的日期以确定某件事发生了多久。 NSDate *then = [NSDate dateWithString:@"1976-04-01 12:34:5
正如标题所述,我的应用程序在客户端崩溃并通过 Parse 崩溃报告进行报告,但我无法在我这边重现它。 在模拟器和真实设备上一切正常,还从app store下载了应用程序工作完美无缺。但直到今天我仍然收
我想要 CLLocationCoordinate2D 的当前时间。 例如,我在东海岸的一个城市,应该知道加利福尼亚偏远地区的时间。我有 CLLocationCoordinate2D。 CLLocati
我正在开发一款应用程序,该应用程序具有在夜间自动进入黑暗/夜间模式的功能。该应用程序询问用户位置并使用 this algorithm 确定日出/日落时间(世界标准时间) . 唯一不明确的步骤是从 UT
如何在 iOS 中获取时区的三个字母缩写 [NSTimeZone abbreviationDictionary] 给出缩写为 3 个字母的代码。例如: NSZT, PDT, EST 等 但是, NSS
希望你一切顺利。 所以我正在开发时区 iOS 应用程序。该应用程序要求我们有一个人口稠密的城市列表,并且当用户选择一个时,它会确定构建 NSTimeZone 对象(然后我们将其用于 NSDate 转换
服务器返回正确的日期和时间。纽约时区。 2013-09-10 05:37:07 +0000(正确的时间,发表评论的时间) 这是我在应用程序中对其进行格式化的方式: [format setDateFor
在我的 IOS 应用程序中,我有一个 timezoneid,如“America/Los_Angeles”,我想得到它的缩写“PST”。 我写了下面的代码: NSTimeZone* theTimezon
[NSTimeZone localTimeZone] 和 [NSTimeZone systemTimeZone] 有什么区别? 最佳答案 根据NSTimeZone引用 iOS,systemTimeZo
所以这就是在 Objective-C 中对日历代码进行单元测试的问题:时区包含有关夏令时的信息,因此您在夏天编写测试,预计 6 月 10 日的日出将在早上 6:02 发生。您的测试通过了,稍后,您在不
我是一名优秀的程序员,十分优秀!