4

我使用下面的实用程序方法来显示过去的秒数、分钟数、小时数等。

例如,1 小时前

我有一个朋友在海外测试我们的 iPhone 应用程序,每次他们提交项目时,该方法总是返回“1 小时前”,因为新西兰提前 2 小时,服务器托管在澳大利亚,显然落后 2 小时。

直到我们的 SQL Server 赶上来;当项目日期开始正确计算时。

只是想知道如何处理时区差异并修改我的 Utility 方法以在全球范围内工作?请随时帮助修改该方法,这样它就不需要那么多代码行(如果你真的很无聊——而且很慷慨)。

提前致谢。

+ (NSString *)elapsedTime:(NSDate *)date {
    NSUInteger desiredComponents = NSYearCalendarUnit | NSMonthCalendarUnit | NSWeekCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;

    NSDateComponents *elapsedTimeUnits = [[NSCalendar currentCalendar] components:desiredComponents
                                                                         fromDate:date
                                                                           toDate:[NSDate date]
                                                                          options:0];

    // Format to be used to generate string to display.
    NSString *scannedFormat = @"%d %@ ago";
    NSInteger number = 0;
    NSString *unit;

    if ([elapsedTimeUnits year] > 0) {
        number = [elapsedTimeUnits year];
        unit = [NSString stringWithFormat:@"year"];
    } else if ([elapsedTimeUnits month] > 0) {
        number = [elapsedTimeUnits month];
        unit = [NSString stringWithFormat:@"month"];
    } else if ([elapsedTimeUnits week] > 0) {
        number = [elapsedTimeUnits week];
        unit = [NSString stringWithFormat:@"week"];
    } else if ([elapsedTimeUnits day] > 0) {
        number = [elapsedTimeUnits day];
        unit = [NSString stringWithFormat:@"day"];
    } else if ([elapsedTimeUnits hour] > 0) {
        number = [elapsedTimeUnits hour];
        unit = [NSString stringWithFormat:@"hour"];
    } else if ([elapsedTimeUnits minute] > 0) {
        number = [elapsedTimeUnits minute];
        unit = [NSString stringWithFormat:@"minute"];
    } else if ([elapsedTimeUnits second] > 0) {
        number = [elapsedTimeUnits second];
        unit = [NSString stringWithFormat:@"second"];
    } else {
        number = 1;
        unit = @"second";
    }

    // Check if unit number is greater than 1, then append 's' at the end.
    if (number > 1) {
        unit = [NSString stringWithFormat:@"%@s", unit];
    }

    // Resultant string required.
    NSString *scannedString = [NSString stringWithFormat:scannedFormat, number, unit];

    return scannedString;
}
4

1 回答 1

7

您需要使用[NSTimeZone localTimeZone]获取 iPhone 当前所在的时区,然后您需要处理本地时间和服务器时间之间的差异。最安全的选择可能是在内部将所有时间转换为 GMT(尤其是在向服务器提交时间时),然后在向用户显示时间时转换为本地时间。

您还可以使用“服务器时间”作为参考时区,确保您的应用程序知道(通过查询服务器或将其硬连接到您的应用程序中)该时区是什么,然后将所有时间值转换为“服务器时间” " 在内部......但是如果您的服务器更改时区,或者当您的服务器启动和结束夏令时时出现按小时关闭的问题,这可能会遇到问题。

You could also store time zones as part of the data you're writing to the server, but really that's just putting off the inevitable: Sooner or later you'll need to convert these times to a reference time zone, so that you can calculate elapsed time.

于 2011-05-06T14:45:54.153 回答