我知道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
似乎不是更好的方式。
答案 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”返回。