今天00:00:00获取NSDate作为时间

Wim*_*tra 6 iphone cocoa objective-c ios

我在Xcode中编写一个类别,它将扩展当前的NSDate类.我想添加两个我经常使用的方法,不知怎的,我不能让它们正常工作.

目前我有这个代码:

+ (NSDate*) today
{
    NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

    NSDateComponents *todayComponents = [gregorian components:(NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit) fromDate:[NSDate date]];
    NSInteger theDay = [todayComponents day];
    NSInteger theMonth = [todayComponents month];
    NSInteger theYear = [todayComponents year];

    NSDateComponents *components = [[NSDateComponents alloc] init];
    [components setDay:theDay]; 
    [components setMonth:theMonth]; 
    [components setYear:theYear];

    NSDate* todayDate = [gregorian dateFromComponents:components];

    [components release];
    [gregorian release];

    return todayDate;
}
Run Code Online (Sandbox Code Playgroud)

我希望它返回这样的日期:"2010-11-03 00:00:00 +01".但不知怎的,时区一直在冒险,因为这段代码返回"2010-11-02 23:00:00 +0000".

任何人都可以告诉我如何修复此代码实际返回正确的日期?或者我可以使用此日期,我的应用程序将自行转换,因为机器设置的时区.

我必须将我的应用程序中的某些事件记录到数据库中,该数据库也只使用[NSDate date]方法.这是否意味着[NSDate date]方法也使用没有时区信息的时间?

编辑:我认为它与夏令时错误有关.我看到的东西与Clock应用程序可能完全相同,但是这些错误让人们起得更晚.此外,TimeZone默认为您设备上当前设置的TimeZone,因此在您更改设置屏幕中的时区之前,它应保持不变.

EDIT2:好的,还有一些测试:

NSLog(@"CurrentDate: %@", [NSDate date]);
NSLog(@"TZ: %@", [NSTimeZone defaultTimeZone]);
Run Code Online (Sandbox Code Playgroud)

给我以下结果:

2010-11-03 23:23:49.000 App[8578:207] CurrentDate: 2010-11-03 22:23:49 +0000
2010-11-03 23:23:49.001 App[8578:207] TZ: Europe/Amsterdam (GMT+01:00) offset 3600
Run Code Online (Sandbox Code Playgroud)

Jos*_*zzi 6

请参阅使用时区.在开始询问日期之前,您需要使用NSCalendar的-setTimeZone:方法设置日历的时区.