Objective c 日期和时区差异

Objective c 日期和时区差异,objective-c,ios,nsdate,Objective C,Ios,Nsdate,我浏览苹果文档和stackoverflow已经有一段时间了,但是我找不到问题的正确答案。 我会尽力解释的。在我的应用程序中,用户可以在特定时间创建测量值。测量的日期和时间很重要 在我的NSDate+助手类别中,我创建了以下助手方法: - (NSDate *)dateByMovingToBeginningOfDay { unsigned int flags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NS

我浏览苹果文档和stackoverflow已经有一段时间了,但是我找不到问题的正确答案。 我会尽力解释的。在我的应用程序中,用户可以在特定时间创建测量值。测量的日期和时间很重要

在我的NSDate+助手类别中,我创建了以下助手方法:

- (NSDate *)dateByMovingToBeginningOfDay
{
    unsigned int flags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
    NSDateComponents* parts = [[NSCalendar currentCalendar] components:flags fromDate:self];
    [parts setHour:0];
    [parts setMinute:0];
    [parts setSecond:0];
    return [[NSCalendar currentCalendar] dateFromComponents:parts];
}

- (NSDate *)dateByMovingToEndOfDay {
    unsigned int flags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
    NSDateComponents* parts = [[NSCalendar currentCalendar] components:flags fromDate:self];
    [parts setHour:23];
    [parts setMinute:59];
    [parts setSecond:59];
    return [[NSCalendar currentCalendar] dateFromComponents:parts];
}
此方法可帮助我从一整天中获得一系列测量值:

NSDate *start = [[NSDate date] dateByMovingToBeginningOfDay];
NSDate *end   = [[NSDate date] dateByMovingToEndOfDay];

NSMutableSet *measurementsSet = [trainingsPlan measurementsWithType:@"used" fromDate:start andToDate:end];
这就是我的问题所在。假设我在模拟器上添加了一个测量值,时间为
2012-03-14 0:42:59(GMT+1)
——因为这是模拟器上显示的时间——并将其保存在核心数据中

[NSDate-date]
当时是
2012-03-13 23:42:59
so
NSDate*start=[[NSDate-date]datebymovingtobingofday]提供前一天的开始日期。这是一个问题


我的问题是,对于所有不同时区的用户来说,最好的方法是什么?

如果你想跨多个时区使用相同的数据,那么你唯一的选择就是在你的应用程序中使用相同的时区,不管iPad说什么时间。通常情况下,您使用UTC进行此操作(并且是创建和保存时间的默认时区)

如果您只是想让它与本地时区匹配,那么您需要像这样更改例程:

- (NSDate *)dateByMovingToBeginningOfDay
{
    NSCalendar *calendar = [NSCalendar currentCalendar];
    [calendar setTimeZone:[NSTimeZone localTimeZone]];

    unsigned int flags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;

    NSDateComponents* parts = [calendar components:flags fromDate:self];
    [parts setHour:0];
    [parts setMinute:0];
    [parts setSecond:0];

    return [calendar dateFromComponents:parts];
}

以同样的方式更新第二个例程。

提到了NSTimeZone,这可能会有所帮助。我从来没有用过它,所以我不能说它能解决你的问题。到底是什么问题?是否要将日期发送到服务器而不发送每个日期的时区?此方法返回日期:2012-03-14 23:00:00+0000It是2300 UTC,即0000本地。调试器只显示UTC和您想使用它的任何其他地方,您需要指定时区。好的,我重新考虑一下。也许最好忽略时区差异,通过移动日期结果来记录日期。我只需要找到另一种方法来获取所选月份,因为通过移动ToBegingOfDay来要求它返回Date的结果是不合逻辑的。但这并不难>。我可以在这个日期加上几天,然后提取月份。如果你在测量时用同样的方法计算时间(或者在iOS之外输入数据),然后,它们都将被更正为UTC,并且您的测量集将正确地包括前一天晚上2300 UTC到当天2300 UTC之间的所有测量值(如预期的0000 Local-0000 Local)。