Iphone 您如何计算Objective-C中特定日期的一年中的哪一天?

Iphone 您如何计算Objective-C中特定日期的一年中的哪一天?,iphone,objective-c,nsdate,nsdateformatter,Iphone,Objective C,Nsdate,Nsdateformatter,这是我发现自己花了几个小时来弄明白的事情,因此我想与大家分享 问题是:如何确定特定日期的一年中的哪一天 e、 1月15日是第15天,12月31日是第365天,不是闰年 和全班同学在一起。使用消息timeintervalncedate。它将返回一个值(实际上是一个双精度值),表示从您想要的日期起经过的秒数。之后,很容易将秒转换为天 如果您截断秒/86400将给您几天时间 假设你想要从2010年1月1日起的天数 // current date/time NSDate *now = [[NSData

这是我发现自己花了几个小时来弄明白的事情,因此我想与大家分享

问题是:如何确定特定日期的一年中的哪一天

e、 1月15日是第15天,12月31日是第365天,不是闰年

和全班同学在一起。使用消息
timeintervalncedate
。它将返回一个值(实际上是一个双精度值),表示从您想要的日期起经过的秒数。之后,很容易将秒转换为天

如果您截断
秒/86400
将给您几天时间

假设你想要从2010年1月1日起的天数

// current date/time
NSDate *now = [[NSData alloc] init]; 

// seconds elapsed since January 1st 2010 00:00:00 (GMT -4) until now
NSInteval interval = [now timeIntervalSinceDate: [NSDate dateWithString:@"2010-01-01 00:00:00 -0400"]];

// days since January 1st 2010 00:00:00 (GMT -4) until now
int days = (int)interval/86400;

因此,我提出的解决方案非常简洁,没有任何复杂之处

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"D"];
NSUInteger dayOfYear = [[formatter stringFromDate:[NSDate date]] intValue];
[formatter release];
return dayOfYear;
我花了很长时间才弄明白的诀窍是使用NSDateFormatter。“D”是一年中某一天的国旗

希望这对那些和我有同样问题的人有所帮助。

试试这个:

NSCalendar *gregorian =
   [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSUInteger dayOfYear =
   [gregorian ordinalityOfUnit:NSDayCalendarUnit
     inUnit:NSYearCalendarUnit forDate:[NSDate date]];
[gregorian release];
return dayOfYear;

其中,
date
是要确定一年中日期的日期。NSCalendar.ordinalityOfUnit方法的文档是

使用ARC并替换不推荐的符号,John Feminella的答案如下:

NSCalendar *greg    = [NSCalendar calendarWithIdentifier:NSCalendarIdentifierGregorian];
NSUInteger dayOfYear= [greg ordinalityOfUnit:NSCalendarUnitDay inUnit:NSCalendarUnitYear forDate:[NSDate date]];
Swift 4变化:

let date = Date() // now
let calendar = Calendar(identifier: .gregorian)
let dayOfYear = calendar.ordinality(of: .day, in: .year, for: Date()) 

别忘了加上一个,因为你得到的值是以零为基础的。问题是,你必须在计算之前为每个日期测试年份。你不希望2011年1月1日成为一年中的第366天,正如戈迪塞莫所说,你不能依靠大常数来计算天数。闰秒呢?或者遥远过去的怪异岁月错过了整整几周的日子?一个简洁的解决方案,但不是最整洁的。;)我认为你有点陷入了以年、月、日为单位的日期思维中,而不是以连续的时间线为单位。日期通常存储为从设定日期起经过的秒数(或天或毫秒或1/10000000秒),这种格式可以很容易地获得年初到特定日期的差值。的确,这是解决问题时的难点。你陷入了一种方法,想不出其他的选择。ThanksHow我是否使用此方法获得伊斯兰日?这是一个古老的方法,但是…..我有一个应用程序,我仍然在使用它。。我运行的问题是闰年,例如2020年1月1日一年中的日期应该是0,但它突然变成365。哇,这可以简化事情,这几乎是我另一个问题的答案,可能是更好的:)