我的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
}
答案 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年。没有努力。