#iphone #objective-c #nsdate #nscalendar #nsdatecomponents
#iPhone #objective-c #nsdate #nscalendar #компоненты nsdatecomponents
Вопрос:
Я использую приведенный ниже метод утилиты для отображения секунд, минут, часов и т.д., Которые прошли.
например, 1 час назад
У меня есть друг за границей, который тестирует наше приложение для iPhone, и каждый раз, когда они отправляют элемент, метод всегда возвращает «1 час назад», потому что Новая Зеландия на 2 часа опережает, а сервер размещен в Австралии, что, очевидно, на 2 часа отстает.
Это только до тех пор, пока наш SQL Server не догонит; когда дата элемента начнет вычисляться правильно.
Просто интересно, как я могу справиться с различиями в часовых поясах и изменить свой служебный метод для работы в глобальном масштабе? Пожалуйста, не стесняйтесь помочь модифицировать метод, чтобы он занимал не так много строк кода (если вам действительно скучно — и щедро).
Заранее спасибо.
(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;
}
Ответ №1:
Вам нужно будет использовать [NSTimeZone localTimeZone]
, чтобы получить часовой пояс, в котором в данный момент находится iPhone, а затем вам нужно будет обработать разницу между местным временем и временем сервера. Вероятно, самым безопасным вариантом является внутреннее преобразование всего времени в GMT (особенно при отправке времени на сервер), а затем преобразование в местное время при отображении времени пользователю.
Вы также можете использовать «серверное время» в качестве контрольного часового пояса, убедиться, что ваше приложение знает (либо путем запроса к серверу, либо жестко подключив его к вашему приложению), что это за часовой пояс, а затем внутренне преобразовать все значения времени в «серверное время»… но это может привести к проблемам, если ваш сервер меняет часовые пояса, или к сбоям на час, когда ваш сервер начинает и заканчивает переход на летнее время.
Вы также могли бы хранить часовые пояса как часть данных, которые вы записываете на сервер, но на самом деле это просто откладывает неизбежное: рано или поздно вам нужно будет преобразовать это время в базовый часовой пояс, чтобы вы могли рассчитать прошедшее время.
Комментарии:
1. Это будет включать
[[NSTimeZone localTimeZone] secondsFromGMT]
иNSDate
методdateByAddingTimeInterval
, но помимо этого мне нужно написать свой собственный код. 🙂