Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 显示一天、一小时前工作不正常?_Ios_Objective C_Relative Time Span - Fatal编程技术网

Ios 显示一天、一小时前工作不正常?

Ios 显示一天、一小时前工作不正常?,ios,objective-c,relative-time-span,Ios,Objective C,Relative Time Span,我已经完成了这个代码 + (NSString *)relativeDateStringForDate:(NSString *)date { NSString *temp; NSString* format = @"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"; // Set up an NSDateFormatter for UTC time zone NSDateFormatter* formatterUtc = [[NSDateFormatte

我已经完成了这个代码

+ (NSString *)relativeDateStringForDate:(NSString *)date
{
    NSString *temp;

    NSString* format = @"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
    // Set up an NSDateFormatter for UTC time zone
    NSDateFormatter* formatterUtc = [[NSDateFormatter alloc] init];
    [formatterUtc setDateFormat:format];
    [formatterUtc setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
    // Cast the input string to NSDate
    NSDate* utcDate = [formatterUtc dateFromString:date];
    // Set up an NSDateFormatter for the device's local time zone
    NSDateFormatter* formatterLocal = [[NSDateFormatter alloc] init];
    [formatterLocal setDateFormat:format];
    [formatterLocal setTimeZone:[NSTimeZone localTimeZone]];
    // Create local NSDate with time zone difference
    NSDate* localDate = [formatterUtc dateFromString:[formatterLocal stringFromDate:utcDate]];
    //calender settings
    NSCalendarUnit units = NSDayCalendarUnit | NSWeekOfYearCalendarUnit |
    NSMonthCalendarUnit | NSYearCalendarUnit | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond ;
    NSCalendar *cal = [NSCalendar currentCalendar];

    //local dates
    NSDate* datetime = [NSDate date];
    NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
    [formatterUtc setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
    [dateFormatter setDateFormat:format];
    NSString* dateTimeInIsoFormatForZuluTimeZone = [dateFormatter stringFromDate:datetime];
    NSDate* sysUTCDate = [dateFormatter dateFromString:dateTimeInIsoFormatForZuluTimeZone];


    NSDateFormatter* formatterLocalFromUtc = [[NSDateFormatter alloc] init];
    [formatterLocalFromUtc setDateFormat:format];
    [formatterLocalFromUtc setTimeZone:[NSTimeZone localTimeZone]];
    // Create local NSDate with time zone difference
    NSDate* curreentDate = [formatterUtc dateFromString:[formatterLocalFromUtc stringFromDate:sysUTCDate]];

    NSDateComponents *components1 = [cal components:(NSCalendarUnitEra|NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay |NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond) fromDate:curreentDate];
    NSDate *today = [cal dateFromComponents:components1];

    //server date
    components1 = [cal components:(NSCalendarUnitEra|NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond) fromDate:localDate];
    NSDate *thatdate = [cal dateFromComponents:components1];



    // if `date` is before "now" (i.e. in the past) then the components will be positive
    NSDateComponents *components = [[NSCalendar currentCalendar] components:units
                                                                   fromDate:thatdate
                                                                     toDate:today
                                                                    options:0];



    if (components.year > 0) {
        temp=[NSString stringWithFormat:@"%ld years ago", (long)components.year];
    } else if (components.month > 0) {
        temp= [NSString stringWithFormat:@"%ld months ago", (long)components.month];
    } else if (components.weekOfYear > 0) {
        temp= [NSString stringWithFormat:@"%ld weeks ago", (long)components.weekOfYear];
    } else if (components.day > 0) {
        if (components.day > 1) {
            temp= [NSString stringWithFormat:@"%ld day ago", (long)components.day];
        } else {
            temp=[NSString stringWithFormat:@"%ld day ago", (long)components.day];
        }
    } else {
        if (components.hour!=0) {
            if(components.hour==1)
            {
                temp= [NSString stringWithFormat:@"%ld hour ago",(long)components.hour];
            }
            else
            {
                temp= [NSString stringWithFormat:@"%ld hours ago",(long)components.hour];
            }

        } else if (components.minute!=0){
            if(components.minute==1)
            {
                temp= [NSString stringWithFormat:@"%ld min ago",(long)components.minute];
            }
            else
            {
                temp=[NSString stringWithFormat:@"%ld mins ago",(long)components.minute];
            }

        }
        else if (components.second!=0){
            if(components.second==1)
            {
                temp= [NSString stringWithFormat:@"%ld sec ago",(long)components.second];
            }
            else
            {
                temp=[NSString stringWithFormat:@"%ld secs ago",(long)components.second];
            }

        }
    }
    return temp;
}
但是它没有正确显示。如果我将任何记录发布到服务器,它会在-1秒前显示 如何用上面的代码解决这个问题

我的服务器日期响应为NSString

2015-09-16T14:16:49.187Z

我需要用服务器日期差异计算当前时间

为了避免这种情况,我增加了+2秒

temp=[NSString stringWithFormat:@"%ld secs ago",(long)components.second+2]; 

这不是完成此任务的好方法,请帮助我。

对于我使用的创建时间之前的东西和
#导入“NSDate+TimeAgo.h”
我创建的应用程序中的委托+方法,如下所示:

+(NSString*)GetTimeAgofromDate:(NSString*)DateString
{
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z"];
    NSDate *dateFromString = [[NSDate alloc] init];
    // voila!
    dateFromString = [dateFormatter dateFromString:DateString];
    NSTimeInterval timeZoneSeconds = [[NSTimeZone localTimeZone] secondsFromGMT];
    NSDate *dateInLocalTimezone = [dateFromString dateByAddingTimeInterval:timeZoneSeconds];


    NSDateFormatter *workingHoursFormatter = [[NSDateFormatter alloc] init];
    [workingHoursFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
   // NSString *str = [workingHoursFormatter stringFromDate:dateInLocalTimezone];
    //;
    NSString *timeAgoFormattedDate = [dateInLocalTimezone timeAgo];


    return timeAgoFormattedDate;

}

这可能对您有帮助。

对于我使用的创建时间之前的东西和
#导入“NSDate+TimeAgo.h”
在应用程序中我创建的代理+方法如下:

+(NSString*)GetTimeAgofromDate:(NSString*)DateString
{
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss'Z"];
    NSDate *dateFromString = [[NSDate alloc] init];
    // voila!
    dateFromString = [dateFormatter dateFromString:DateString];
    NSTimeInterval timeZoneSeconds = [[NSTimeZone localTimeZone] secondsFromGMT];
    NSDate *dateInLocalTimezone = [dateFromString dateByAddingTimeInterval:timeZoneSeconds];


    NSDateFormatter *workingHoursFormatter = [[NSDateFormatter alloc] init];
    [workingHoursFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
   // NSString *str = [workingHoursFormatter stringFromDate:dateInLocalTimezone];
    //;
    NSString *timeAgoFormattedDate = [dateInLocalTimezone timeAgo];


    return timeAgoFormattedDate;

}

这可能会对您有所帮助。

这是一种错误的方法来避免这种情况,我添加了+2秒手动不要这样做,结果是你在这里得到的NSDate*utcDate和NSDate*localDateutcDate是srver date,我设置了日期格式化程序来更改本地时区并将其存储在本地。这是一种错误的方法来避免这种情况,我手动添加了+2秒不要这样做你在这里得到的结果NSDate*utcDate和NSDate*localDateutcDate是srver date,我将日期格式化程序设置为更改本地时区并将其存储在LOCADATHE。这是我的工作代码,我这边的工作参数有效。请确保日期格式这是我的工作代码,我这边的工作参数有效。请确保日期正确格式