gpt4 book ai didi

iPhone/Objective-C - 帮助解决海外时区的 NSDateComponents 和 NSCalendar 问题

转载 作者:太空狗 更新时间:2023-10-30 04:01:29 26 4
gpt4 key购买 nike

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

例如,1 小时前

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

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

只是想知道如何处理时区差异并修改我的 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;
}

最佳答案

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

您还可以使用“服务器时间”作为引用时区,确保您的应用知道(通过查询服务器或将其硬连接到您的应用中)该时区是什么,然后将所有时间值转换为内部“服务器时间”……但如果您的服务器更改时区,或者当您的服务器开始和结束夏令时时,可能会出现按小时计算的问题。

您还可以将时区存储为您写入服务器的数据的一部分,但实际上这只是推迟不可避免的事情:迟早您需要将这些时间转换为引用时区,以便你可以计算耗时。

关于iPhone/Objective-C - 帮助解决海外时区的 NSDateComponents 和 NSCalendar 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5912647/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com