如何在所有情况下从NSDate获得正确的一年?

时间:2016-04-01 09:20:56

标签: ios nsdate nscalendar nsdatecomponents

我知道NSDateComponents,但问题是某种基于周的机制会在日期处于头顶或一年之后弄乱结果。

例如:

NSCalendar *calendar = [NSCalendar currentCalendar];
NSCalendarUnit calendarUnit = NSYearCalendarUnit;
NSDateComponents *dateComponents = [calendar components:calendarUnit fromDate:self.date];

(lldb) po self.date
2015-12-31 16:00:00 +0000

(lldb) po dateComponents
<NSDateComponents: 0x12f4c83f0>
    Calendar Year: 2016

更改minimumDaysInFirstWeek也没有太大区别,NSDateFormatter似乎不是更好的方式。

3 个答案:

答案 0 :(得分:3)

@Larme在评论中表示,您当地的时区会影响您的结果;

您已于2015年12月31日下午4点在UTC指定。这是2016年1月1日午夜的当地时区(UTC + 8)。

您可以使用NSCalendar方法componentsInTimeZone获取特定时区的年份:

NSCalendar *calendar = [NSCalendar currentCalendar];
NSTimeZone *tz=[NSTimeZone timeZoneForSecondsFromGMT:0];
NSDateComponents *dateComponents = [calendar componentsInTimeZone:tz fromDate:self.date];
int year=dateComponents.year;  // This will be 2015 

答案 1 :(得分:0)

你的代码非常好。 var newList = list1.OrderBy(i => { var x = list2.IndexOf(i); if(x == -1) return int.MaxValue; return x; }); 命令会根据po显示时间说明,而UTC / NSCalendar会考虑当前时区。

NSDateComponents

2015-12-31 16:00:00 +0000

都是同一时刻。

如果您必须始终处理基于UTC的日期,请将2016-01-01 00:00:00 +0800 实例的时区设置为NSCalendar

答案 2 :(得分:0)

“年”组件将始终返回正确的年份 - 基于正在使用的日历! NSDate以UTC格式记录,但年份是使用您当地的时区计算的。您提供的日期是2015年在伦敦使用GMT(接近UTC),但2016年在世界其他地区。例如在澳大利亚,那时的新年烟花早已消失。

当您查看日历周时,这是一个完全不同且完全不相关的主题。 12月31日可以是一年的最后一周,也可以是下一周的第一周。但那不是“年”所返回的。它由“yearForWeekOfYear”返回。