有没有办法检测NSDate所处的千禧年?

时间:2014-05-29 15:38:04

标签: ios objective-c nsdate

我的NSDate字符串中有01/01/14。不幸的是,字符串以两位数保存,所以我不知道年份是从1900年还是2000年。但我想创造一些智能代码来猜测全年的千年和世纪。我知道一个事实(基于我正在创建的应用程序),在99%的情况下,年份不能低于1900。

我已将日期转换为现在显示的四位数,但现在显示为01/01/0014

有没有办法将NSDate的千禧年视为0并相应地进行更改?

我真正想做的是这样的事情(伪代码):

if (millennium == 0 && decade < 15 && decade > 99)
{
   millennium = 2;
   century = 0;
   // change the date to 2000's here
}
else if (millennium == 00)
{
   millennium = 1;
   century = 9;
   // change the date to 1900's here
}

4 个答案:

答案 0 :(得分:3)

对于初学者来说,你的伪代码不是很正确(第一个if语句是一个不可能的条件,因为十年不能小于15且同时超过99)。

我已经使用NSDateComponents创建了一个基本解决方案,并根据自己的条件来决定何时更改您可以轻松更改的年份。

NSDate *date; // this is your date

NSDateComponents* components = [[NSCalendar currentCalendar] components: NSMonthCalendarUnit | NSDateCalendarUnit | NSYearCalendarUnit fromDate:date];

if([components year] < 15) // 2000 to 2015
{
  [components setYear:[components year] + 2000];
}
else if([components year] < 100) // 1915 to 1999
{
  [components setYear:[components year] + 1900];
}

date = [NSCalendar currentCalendar] dateFromComponents:components];

答案 1 :(得分:0)

这里有一个oldschool的东西(从80年代开始)将一年的2位数转换成4位数的年份。

int finalYear = (19 + (yearIn2Digits < 50)) * 100 + yearIn2Digits;

然后您可以使用finalYear值来构建正确的NSDate对象。

所涵盖的间隔始终为100年,您可以在哪里画线。最初的想法在1950年到2049年之间起作用 - 正如你在公式中所看到的那样 - 但是你可以改进它以更好地覆盖你的实际年限。

答案 2 :(得分:0)

我不建议硬编码这个逻辑。 如果您想转换1908年或2015年的日期该怎么办。

更聪明的方法如下:


-(BOOL)isInCurrentDecade:(NSDate*)date{

  // I don't recollect the api to extract year from NSDate
  NSInteger tmpYear = [date year];
  NSInteger currentYear = [[NSDate date] year];

  return  tmpYear > currentYear%100

}

我在这里做的是将87,04,99与当前年份数字14进行比较14.如果它在00和现在的十年之间。此代码比您的代码更强大,因为它与当前日期的相对比较

代码的o / p如下:2014年:

87 - > NO  // in 90's
99 -> NO
04 - > YES // in 2000's  
12 - > YES 

当您的日期包含1/1/14时,如果您希望在当前十年内对其进行过滤,请更换“&#39;&gt;&#39;用&#39; &GT; =&#34;

答案 3 :(得分:0)

使用NSDateFormatter及其属性“twoDigitStartDate”。您将此设置为您希望能够以两位数年份输入的最早日期。无需复杂的逻辑,易于更新。现在数据输入是一回事,但存储一个“两位数年份”的日期,这是犯罪行为。

它处理诸如“我希望能够存储从1985年纳税年度开始的两个数字,即1985年4月1日”的东西。然后4月1日85将在1985年,而3月31日85将在2085年。没有努力。