Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone NSDate问题-或如何忽略日期/时区?_Iphone_Objective C_Nsdate_Nsdateformatter - Fatal编程技术网

Iphone NSDate问题-或如何忽略日期/时区?

Iphone NSDate问题-或如何忽略日期/时区?,iphone,objective-c,nsdate,nsdateformatter,Iphone,Objective C,Nsdate,Nsdateformatter,好吧,我已经放弃了。这就是我要做的:我有日出,日落,还有某个时区的当前时间。我想知道是白天还是晚上,通过计算当前时间是否介于日出和日落之间 以下是我所拥有的: NSLog(@"%@ - %@ - %@",currTime,sunrise,sunset); NSDateFormatter *formatter1 = [[NSDateFormatter alloc]init]; NSDateFormatter *formatter2 = [[NSDateFormatter al

好吧,我已经放弃了。这就是我要做的:我有日出,日落,还有某个时区的当前时间。我想知道是白天还是晚上,通过计算当前时间是否介于日出和日落之间

以下是我所拥有的:

NSLog(@"%@ - %@ - %@",currTime,sunrise,sunset);

NSDateFormatter *formatter1 = [[NSDateFormatter alloc]init];
NSDateFormatter *formatter2 = [[NSDateFormatter alloc]init];
[formatter1 setDateFormat:@"hh:mm a"];
[formatter2 setDateFormat:@"EEE, dd MMM yyyy h:mm a z"];
NSDate *rise = [formatter1 dateFromString:sunrise];
NSDate *set = [formatter1 dateFromString:sunset];
NSDate *time = [formatter2 dateFromString:currTime];    
[formatter1 release];
[formatter2 release];

unsigned int flags = NSHourCalendarUnit | NSMinuteCalendarUnit;
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *components1 = [calendar components:flags fromDate:rise];
NSDateComponents *components2 = [calendar components:flags fromDate:set];
NSDateComponents *components3 = [calendar components:flags fromDate:time];

NSDate *Sunrise = [calendar dateFromComponents:components1];
NSDate *Sunset = [calendar dateFromComponents:components2];
NSDate *Time = [calendar dateFromComponents:components3];

NSLog(@"\nSunrise: %@ \nSunset:%@ \nTime:%@",rise,set,time);
NSLog(@"\nSunrise: %@ \nSunset:%@ \nTime:%@",Sunrise,Sunset,Time);
以下是第一个输出:

2011年6月10日星期五上午4:00萨斯特-上午7:46-下午5:41

这是第二个(在只关注时间而不是日期之前)

日出:1969-12-3122:46:00+0000

日落:1970-01-01 08:41:00+0000

时间:2011-06-10200:00+0000

最后,这里是最后一个输出(注意时间是多么混乱?)

日出:0001-12-3122:27:01+0000

日落:0001-01-01 08:22:01+0000

时间:0001-01-01:41:01+0000

因此,我想将这些结果日期放入我的方法中,以检查它是否在两个日期之间:

+(BOOL)date:(NSDate*)date isBetweenDate:(NSDate*)beginDate andDate:(NSDate*)endDate {
    return (([date compare:beginDate] != NSOrderedAscending) && ([date compare:endDate] != NSOrderedDescending));
}
但是,在我解决日期问题之前,该方法不会起作用。:/我需要帮助!我做错了什么


好的,所以我放弃了让
NSDate
s为我工作的尝试。时区的问题让我整个周末的大脑都崩溃了。无论如何,我决定使用
BoopMeister
suggestion,但它并不像我期望的那样工作。下面是一个例子:

使用上面的设置,我添加了以下行:

NSInteger riseHour = [components1 hour];
NSInteger setHour = [components2 hour];
NSInteger timeHour = [components3 hour];

NSLog(@"Rise: %i  Set: %i  Time: %i",riseHour,setHour,timeHour);
现在,当我插入这些变量时: 当前时间:2011年6月10日星期五CDT上午9:07 日出:上午6:33 日落:晚上8:32

然而,当我从上述方法输出字符串时,我得到的是:

上升:6组:20次:23


什么是?

我会使用您已有的组件,而不会创建新的日期

从代码中的这一点开始:

NSDateComponents *riseComponents = [calendar components:flags fromDate:rise];
NSDateComponents *setComponents = [calendar components:flags fromDate:set];
NSDateComponents *timeComponents = [calendar components:flags fromDate:time];
然后像

NSInteger riseHour = [riseComponents hour];
NSInteger setHour = [setComponents hour];
NSInteger timeHour = [timeComponents hour];

// Do some checks here
// If necessary do the same for the minutes ([components minute])
在我的应用程序中,比较日期一直是一个性能问题,因为您已经有了dateComponents,所以自己检查并使用NSIntegers会更快


好的,从问题中可以看出,它给出了小时数的表示。分钟也一样。在那之后建立你的支票


当前时间的问题可能在于您使用的日历。它会自动将时间转换为您使用的日历时区中的时间。您还可以创建带有时区字符串表示形式的日历。我想是在NSCalendar的API中。制作完日历后,请将该日历用于当前时间。

NSDate的一个关键点是它以GMT为单位。始终如此。但是,当您记录它时,它会根据用户的区域设置进行打印

现在当你这么做的时候

NSDateFormatter *formatter1 = [[NSDateFormatter alloc]init];
[formatter1 setDateFormat:@"hh:mm a"];
NSDate *rise = [formatter1 dateFromString:sunrise];
NSDate *set = [formatter1 dateFromString:sunset];
[formatter1 release];
您只是提供有关小时、分钟以及是否为上午/下午的信息。怎么知道时间属于哪一天。它通过默认设置为1970年1月1日和基于用户区域设置的时区来填补信息的不足。您在当前时间提供的时区信息可能与用户的区域设置相同,也可能不同


要解决此问题,必须生成一个包含日落时间的日期和时区信息的字符串,并将其以正确格式传递给日期格式化程序以获取日期。我想你一定有这个(否则你怎么知道那天是日落或日出的时间?)。既然你知道这个地方,你也应该能够得到时区信息。一旦你有了正确的信息来构建日期,你使用的每一种比较方法都会起作用。

我不久前也遇到了同样的问题,我实际上放弃了
NSDate
,而只是编写了自己的日期方法。不过,我很期待看到其他人是否对此有答案。我不想在NSDate上放弃。我喜欢它,但它讨厌我。好吧,我可以这么做。但它仍然存在问题。请在问题中再次查看我的更新。不确定。我会接受你的回答,只是因为你帮助了我,但它仍然不起作用。哦,好吧!